好的,我主要是LAMP开发人员,所以我是实体框架的新手。但是,我熟悉LINQ的基础知识,并从我的数据库中生成了一个实体模型。现在这是我的要求:
我在WinForm上有一个数据网格,每隔几秒就会从远程服务器上的数据源刷新一次,因为数据集的更改是从其他来源进行的。显然,我想构造一个lambda表达式来获得正确的匿名类型,以满足需要在我的数据网格中显示的列。我已经这样做了,这是结果(我使用自定义数据网格控件,顺便说一句):
到目前为止我的代码:
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()
然后告诉我的数据网格从数据源更新?调用该方法实际上是运行上面的lambda表达式还是从DB加载所有内容?
感谢您对此提供任何帮助。此外,如果您有任何最佳实践可以分享,那将是非常棒的!我希望我能够彻底解释这一点,因为你需要提供帮助。
答案 0 :(得分:3)
1)您可以始终创建自己的包含只读属性van_status的类,而不是使用分部类修改EF对象。你得到的代码几乎相同:
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中的代码封装在您自己的方法中,并从您的计时器事件触发中调用它(或者您选择实现定期刷新)。
答案 1 :(得分: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; }
}
}