使用EF进行Linq过滤器收集

时间:2009-12-10 15:13:46

标签: linq entity-framework

我正在尝试让Entity Framework选择一个对象并同时过滤其集合。我有一个JobSeries对象,其中包含一系列作业,我需要做的是按ID选择一个作业系列并通过SendDate过滤所有作业,但我不敢相信这个简单查询有多难!

这是有效的基本查询:

 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;

由于

2 个答案:

答案 0 :(得分:9)

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 很多 更简单。
  3. 任何地方都没有无字段字符串。
  4. 您始终可以获得所需的数据,而无需在两个地方(Include和其他地方)指定数据。
  5. 检索不需要的列时不会受到带宽处罚。
  6. EF 4中的免费性能提升。
  7. 关键是在LINQ中思考,而不是在SQL中或在实现整个实体时,没有充分理由像使用旧的ORM那样。

答案 1 :(得分:-1)

我很久就放弃了.Include()并实施了Lazy loading for Entity Framework