【问题标题】:.Include in following query does not include really.include 在下面的查询中不包括真的
【发布时间】:2013-01-09 20:57:28
【问题描述】:
var diaryEntries = (from entry in repository.GetQuery<OnlineDiary.Internal.Model.DiaryEntry>()
                               .Include("DiaryEntryGradeChangeLog")
                               .Include("DiaryEntryAction")
                                           join diary in repository.GetQuery<OnlineDiary.Internal.Model.OnlineDiary>()                                           
                                           on entry.DiaryId equals diary.Id
                                           group entry
                                           by diary
                                           into diaryEntriesGroup
                                           select new { Diary = diaryEntriesGroup.Key,
                                               DiaryEntry = diaryEntriesGroup.OrderByDescending(diaryEntry => diaryEntry.DateModified).FirstOrDefault(),
                                           });

这个查询不包括“DiaryEntryGradeChangeLog”和“DiaryEntryAction”导航属性,这个查询有什么问题?

我已从查询中删除连接并按照以下进行更正,但它仍然没有填充任何内容

var diaryEntries = from entry in repository.GetQuery<OnlineDiary.Internal.Model.DiaryEntry>()
                                   .Include("DiaryEntryGradeChangeLog").Include("DiaryEntryAction")
                                   .Where(e => 1 == 1)
                                       group entry
                                       by entry.OnlineDiary
                                       into diaryEntryGroups
                                       select 
                                       new { DiaryEntry = diaryEntryGroups.OrderByDescending(diaryEntry => diaryEntry.DateModified).FirstOrDefault() };

【问题讨论】:

  • 它只是说它们是空的,即使我可以在数据库中正确地看到它们。
  • 澄清一下,“不填充任何内容”是指diaryEntries 为空吗?还是没有物品的IQueryable?或者填充了正确数量的具有空属性的对象?
  • diaryEntries 正在填充 DiaryEntry 的集合,这很好......“DiaryEntryGradeChangeLog”集合和“DiaryEntryAction”导航属性为空。

标签: entity-framework include


【解决方案1】:

不会的。 Include 仅在查询的形状不改变(按设计)时才有效。如果您使用此查询,它将起作用,因为查询的形状仍然相同 (OnlineDiary.Internal.Model.DiaryEntry):

var diaryEntries = (from entry in repository.GetQuery<OnlineDiary.Internal.Model.DiaryEntry>()
                           .Include("DiaryEntryGradeChangeLog")
                           .Include("DiaryEntryAction");

但是,一旦您使用手动连接、分组或投影 (select new { }),您就改变了查询的形状,所有 Include 调用都将被跳过。

编辑:

你必须使用这样的东西(未经测试)来获取相关数据:

var diaryEntries = from entry in repository.GetQuery<OnlineDiary.Internal.Model.DiaryEntry>()
                   group entry by entry.OnlineDiary into diaryEntryGroups
                   let data = diaryEntryGroups.OrderByDescending(diaryEntry => diaryEntry.DateModified).FirstOrDefault()
                   select new { 
                       DiaryEntry = data,
                       GradeChangeLog = data.DiaryEntryGradeChangeLog,
                       Action = data.DiaryEntryAction
                   };

或任何类似的查询,您手动填充投影到匿名或未映射类型的关系的属性。

【讨论】:

  • 因此您不能使用Include,您必须使用更复杂的投影来加载相关数据或通过单独的查询加载相关数据。
  • 连接导致问题,但选择应该没问题,因为它是在计算结构后应用的?
  • 请查看问题的编辑版本,我已放入修改后的查询中,但它仍然没有填充任何内容
  • 您仍在使用分组和投影。您不能在此类查询中使用 Include。
  • 我很感兴趣,它的工作方式是“按设计”的——这个决定背后的理性可能是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多