Linq过滤器集合与EF
我试图让实体框架选择一个对象,并在同一时间过滤它的集合。我有一个JobSeries对象,它有一个作业集合,我需要做的是通过ID选择一个工作系列,并通过SendDate筛选所有作业,但我不敢相信这个简单查询有多困难!Linq过滤器集合与EF
这是工作的基本查询:
var q = from c in KnowledgeStoreEntities.JobSeries
.Include("Jobs.Company")
.Include("Jobs.Status")
.Include("Category")
.Include("Category1")
where c.Id == jobSeriesId
select c;
任何帮助,将不胜感激,我一直在试图找到谷歌的东西,我想要做的是在这里:http://blogs.msdn.com/bethmassi/archive/2009/07/16/filtering-entity-framework-collections-in-master-detail-forms.aspx
这是在VB.NET中,但我无法将其转换为C#。
编辑:我现在已经尝试这样做,这是行不通的!:
var q = from c in KnowledgeStoreEntities.JobSeries
.Include("Jobs")
.Include("Jobs.Company")
.Include("Jobs.Status")
.Include("Category")
.Include("Category1")
where (c.Id == jobSeriesId & c.Jobs.Any(J => J.ArtworkId == "13"))
select c;
感谢
丹
Include
可能会引入性能问题。延迟加载是保证引入性能问题。投影便宜又容易:
var q = from c in KnowledgeStoreEntities.JobSeries
where c.Id == jobSeriesId
select new
{
SeriesName = c.Name,
Jobs = from j in c.Jobs
where j.SendDate == sendDate
select new
{
Name = j.Name
}
CategoryName = c.Category.Name
};
显然,我在猜名字。但是请注意:
- 过滤工作。
- SQL is much更简单。
- 任何地方都没有无类型的字符串。
- 您始终可以获得所需的数据,而无需在两个地方(
Include
和其他地方)指定它。 - 没有带宽处罚检索你不需要的列。在EF
- 免费的性能提升4
,关键是要觉得在LINQ,而不是SQL或者,你会与旧的ORM物化整个实体没有很好的理由。
+1最后一句 – mkedobbs 2009-12-10 21:57:44
这是一个很好的答案,非常丰富,但对我来说不太合适,因为我不想返回一个匿名对象,我需要一个JobSeries对象,并且过滤作业。最终的结果 我发现了一个VB.NET例如: 昏暗查询=从c在db.Customers _ 凡c.CustomerID = 1 _ 选择客户= C,_ 订单=由邻在c.Orders _ 哪里o.OrderDate> =#1/1/2009# 我想我对EF没有足够的经验,而且我讨厌这个事实,那么简单的事情让我觉得很累!在这个实验后回到流利的NHibernate! – Dan 2009-12-11 11:27:59
这听起来像你想要使用EF,就好像它是NHibernate一样。这将永远不会工作,因为NHibernate使用(有点古老,恕我直言)不同的工作方式,因为它多年来一直没有LINQ支持,在该部门仍然非常有限。你不必在这里使用匿名类型;常规的POCOs可以正常工作,但是如果你的代码完全依赖于获取实体类型,那么你几乎可以保证在任何工具中做太多的SQL,因为通常在实体上有更多的属性比你需要的更多操作。 – 2009-12-11 13:33:17
你能解释一下“过滤”的含义吗?你想在一定的日期范围内的对象? – 2009-12-10 15:19:28
基本上我想选择一个JobSeries,其中id = 1,并从Job的子集合中选择Job.SendDate = 01/12/2009。谢谢 – Dan 2009-12-10 15:43:30