![](/img/trans.png)
[英]Best way to use LINQ to Entities with a Collection Property
[英]LINQ to Entities - Best way to accomplish this?
好的,我主要是LAMP开发人员,所以我是实体框架的新手。 但是,我熟悉LINQ的基础知识,并且已经从我的数据库生成了一个实体模型。 现在这是我的要求:
我在WinForm上有一个数据网格,每隔几秒钟就会从远程服务器上的数据源刷新一次,因为对数据集的更改是从其他源进行的。 显然,我想构造一个lambda表达式来获取正确的匿名类型,以满足需要在我的数据网格中显示的列。 我已经做到了,这就是结果(我正在使用自定义datagrid控件,顺便说一句):
到目前为止,我的代码是:
Models.dataEntities objDB = new Models.dataEntities();
var vans = from v in objDB.vans
select v;
gcVans.DataSource = vans;
好的,现在我有了基本数据集。 我遇到的一个问题是“状态”列将基于数据集中的几个参数显示一个计算出的字符串。 我通过局部类将其添加到我的实体中。 正如您在屏幕截图中所看到的,这可以正常工作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WindowsFormsApplication1.Models {
public partial class van {
public string van_status {
get {
if (this.is_offline == 1) {
return "Offline";
} else if (this.is_prayer_room == 1) {
return "In Prayer Room";
} else {
return "TODO: Create statuses";
}
}
}
}
}
此添加的属性工作正常。 但是,第二次我尝试以匿名类型投影状态,以便我也可以检索学校名称,但出现错误:
Models.dataEntities objDB = new Models.dataEntities();
var vans = from v in objDB.vans
select new {
van_name = v.van_name,
school_name = v.school.school_name,
capacity = v.capacity,
phone = v.phone,
van_status = v.van_status
};
gcVans.DataSource = vans;
因此,我有两个问题:
1)如果我不能在LINQ投影中使用局部类的计算属性,应该如何在我的数据网格中显示我的计算字符串?
2)我什至正确地做到了吗? 当我解决#1时,如何刷新此数据(即在计时器触发事件期间)? 我会简单地调用objDB.refresh()
,然后告诉我的datagrid从数据源进行更新吗? 调用该方法是否实际上在上面运行了lambda表达式,还是从数据库加载了所有内容?
感谢您的协助。 此外,如果您有任何最佳做法可以分享,那就太好了! 我希望我能在您需要协助的情况下详尽地解释这一点。
1)不必使用局部类来修改EF对象,您始终可以创建自己的包含只读属性van_status的类。 您获得的代码几乎相同:
Models.dataEntities objDB = new Models.dataEntities();
gcVans.DataSource = from v in objDB.vans
select new DisplayVan {
van_name = v.van_name,
school_name = v.school.school_name,
capacity = v.capacity,
phone = v.phone,
};
van_status属性是只读的,因此无需在查询中指定。
2)我不是Web开发人员,而是桌面开发人员,因此,我将向您介绍如何刷新网格(对于胖客户端来说,它可能不是首选的方法)...
我不愿意信任.Refresh()方法,并希望所有方法都能最大限度地提高效率并正常工作。 而是将#1中的代码封装到您自己的方法中,并从计时器事件触发中调用它(或者您选择实施定期刷新)。
另一个不错的选择是创建一个扩展方法。
这是一个简单的示例:
using System;
namespace WindowsFormsApplication1 {
static class Program {
[STAThread]
static void Main() {
Van van = new Van();
string status = van.GetStatus();
}
}
public static class VanExtension {
public static string GetStatus(this Van van) {
if(van.is_offline == 1) {
return "Offline";
}
else if(van.is_prayer_room == 1) {
return "In Prayer Room";
}
return "TODO: Create statuses";
}
}
public class Van {
public int is_offline { get; set; }
public int is_prayer_room { get; set; }
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.