【问题标题】:LINQ to Entities (Entity Framework) Join and .Include conflictLINQ to Entities (Entity Framework) Join 和 .Include 冲突
【发布时间】:2010-03-10 19:41:33
【问题描述】:

我想做的事情似乎很简单。我想选择一些雇主,我想包括按年份和季度降序排序的最近 6 个季度数据记录。

考虑表达式:

var query = from e in data.Employer.Include("EmployerQuarterly")
            where e.UIAccount == 22
            select e;

我走在正确的轨道上,因为我获得了我想要的 7 份雇主记录,而且每份记录都包含所有季度数据。现在我要做的就是对这些数据进行排序并只选择前 6 条记录。

这个表达式完成了排序,但不是6的限制。

var query = from e in data.Employer.Include("EmployerQuarterly")
            from q in e.EmployerQuarterly
            where e.UIAccount == 22
            orderby q.Year descending, q.Quarter descending
            select e;

上面的查询还有两个副作用。我现在取回了 208 条记录,而不是原来的 7 条,而且我不再取回任何 EmployerQuarterly 数据!

我不想牺牲我急切的加载。我对 L2E 的要求是否可行?

【问题讨论】:

  • 您的问题是否应该只是我如何根据标准 x 获得每个 EmployerQuarterly 的前七行?

标签: linq linq-to-entities


【解决方案1】:

您不能限制关系,因为 EF 不会加载部分实现的实体。因此,如果要加载相关数据的子集,则需要投影到 POCO 上,而不是加载实体。即:

var query = from e in data.Employer
            where e.UIAccount == 22
            select new
            {
                Id = e.Id,
                Name = e.Name,
                // etc.
                Quarterlies = (from q in e.EmployerQuarterly
                               orderby q.Year descending, q.Quarter descending
                               select new
                               {
                                   Id = q.Id,
                                   // etc.
                               }).Take(6)
            };

因为您正在投影,所以您不再需要 Include()

【讨论】:

  • 我想避免投影,但这还不错。
  • 您是否真的知道如果我选择 new { Employer = e, ...{在此处插入其余代码},Materializer 会自动将季度滚动到 Employer 对象中?即我可以说 result.Employer.First().EmployerQuarterly.Count() 并且它们都在那里,就像我想要的那样,即使这不是我真正要求的?相当惊人的未记录功能!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多