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; 

感谢

+1

你能解释一下“过滤”的含义吗?你想在一定的日期范围内的对象? – 2009-12-10 15:19:28

+1

基本上我想选择一个JobSeries,其中id = 1,并从Job的子集合中选择Job.SendDate = 01/12/2009。谢谢 – Dan 2009-12-10 15:43:30

我早就放弃了.Include()和实施Lazy loading for Entity Framework

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 
     }; 

显然,我在猜名字。但是请注意:

  1. 过滤工作。
  2. SQL is much更简单。
  3. 任何地方都没有无类型的字符串。
  4. 您始终可以获得所需的数据,而无需在两个地方(Include和其他地方)指定它。
  5. 没有带宽处罚检索你不需要的列。在EF
  6. 免费的性能提升4

,关键是要觉得在LINQ,而不是SQL或者,你会与旧的ORM物化整个实体没有很好的理由。

+3

+1最后一句 – mkedobbs 2009-12-10 21:57:44

+1

这是一个很好的答案,非常丰富,但对我来说不太合适,因为我不想返回一个匿名对象,我需要一个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

+2

这听起来像你想要使用EF,就好像它是NHibernate一样。这将永远不会工作,因为NHibernate使用(有点古老,恕我直言)不同的工作方式,因为它多年来一直没有LINQ支持,在该部门仍然非常有限。你不必在这里使用匿名类型;常规的POCOs可以正常工作,但是如果你的代码完全依赖于获取实体类型,那么你几乎可以保证在任何工具中做太多的SQL,因为通常在实体上有更多的属性比你需要的更多操作。 – 2009-12-11 13:33:17