C# LINQ到实体-实现这一点的最佳方法?
好的,我主要是一个LAMP开发人员,所以我是实体框架的新手。但是,我熟悉LINQ中的基础知识,并且已经从我的数据库生成了一个实体模型。下面是我的要求: 我在WinForm上有一个datagrid,当从其他源对数据集进行更改时,它每隔几秒钟就会从远程服务器上的数据源刷新一次。显然,我想构造一个lambda表达式来获得正确的匿名类型,以满足需要在我的datagrid中显示的列。我已经这样做了,结果如下(顺便说一句,我使用的是自定义datagrid控件): 到目前为止,我的代码是:C# LINQ到实体-实现这一点的最佳方法?,c#,linq,linq-to-sql,linq-to-entities,C#,Linq,Linq To Sql,Linq To Entities,好的,我主要是一个LAMP开发人员,所以我是实体框架的新手。但是,我熟悉LINQ中的基础知识,并且已经从我的数据库生成了一个实体模型。下面是我的要求: 我在WinForm上有一个datagrid,当从其他源对数据集进行更改时,它每隔几秒钟就会从远程服务器上的数据源刷新一次。显然,我想构造一个lambda表达式来获得正确的匿名类型,以满足需要在我的datagrid中显示的列。我已经这样做了,结果如下(顺便说一句,我使用的是自定义datagrid控件): 到目前为止,我的代码是: Models.d
Models.dataEntities objDB = new Models.dataEntities();
var vans = from v in objDB.vans
select v;
gcVans.DataSource = vans;
好的,现在我有了我的基本数据集。我遇到的一个问题是,“Status”列将根据数据集中的几个参数显示一个计算字符串。我通过一个分部类将其添加到实体中。正如您在屏幕截图中所看到的,这是正常工作的:
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投影中使用我的分部类的计算属性,我应该如何在我的datagrid中显示我的计算字符串
2) 我的做法正确吗?当我解析#1时,我将如何刷新此数据(即在计时器触发事件期间)?我是否只需调用objDB.refresh()
,然后告诉我的datagrid从数据源进行更新?调用该方法实际上是运行上面的lambda表达式,还是从DB加载所有内容
谢谢你在这方面的帮助。此外,如果您有任何最佳实践可以分享,那将是非常棒的!我希望在您需要提供帮助时,我已经详细解释了这一点。1)您可以创建自己的包含只读属性vanu状态的类,而不是使用分部类修改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的代码封装在您自己的方法中,并从计时器事件触发中调用它(或者以您选择的方式实现定期刷新)。另一个好的选择是创建扩展方法 下面是一个简单的例子:
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; }
}
}
- 请确保将此扩展类与实体类放在同一命名空间中