EF LINQ包含多个嵌套实体

好吧,我有三层级的实体,具有以下层次:课程 – >模块 – >章节

这里是最初的EF LINQ声明:

Course course = db.Courses .Include(i => i.Modules.Select(s => s.Chapters)) .Single(x => x.Id == id); 

现在,我想包含另一个与课程相关的名为Lab的实体。

如何包含Lab实体?

我尝试了以下,但它没有工作:

 Course course = db.Courses .Include(i => i.Modules.Select(s => s.Chapters) && i.Lab) .Single(x => x.Id == id); 

包括第二个实体的任何想法?

任何build议或信息将不胜感激。 谢谢!

你有没有尝试只是添加另一个Include

 Course course = db.Courses .Include(i => i.Modules.Select(s => s.Chapters)) .Include(i => i.Lab) .Single(x => x.Id == id); 

您的解决scheme失败,因为Include不采取布尔运算符

 Include(i => i.Modules.Select(s => s.Chapters) && i.Lab) ^^^ ^ ^ list bool operator other list 

更新要了解更多信息,请下载LinqPad并查看示例。 我认为这是熟悉Linq和Lambda的最快捷方式。

作为开始 – SelectInclude之间的区别在于,用select您决定要返回(又名投影)。 Include是一个Eager Loading函数,它告诉Entity Framework你希望它包含来自其他表的数据。

包含语法也可以是string。 喜欢这个:

  db.Courses .Include("Module.Chapter") .Include("Lab") .Single(x => x.Id == id); 

但LinqPad的样本更好地解释了这一点。

Include是stream畅接口的一部分,因此可以编写多个Include语句

  db.Courses.Include(i => i.Modules.Select(s => s.Chapters)) .Include(i => i.Lab) .Single(x => x.Id == id); 

你也可以试试

 db.Courses.Include("Modules.Chapters").Single(c => c.Id == id); 

有人可能会写这样的扩展方法:

  /// <summary> /// Includes an array of navigation properties for the specified query /// </summary> /// <typeparam name="T">The type of the entity</typeparam> /// <param name="query">The query to include navigation properties for that</param> /// <param name="navProperties">The array of navigation properties to include</param> /// <returns></returns> public static IQueryable<T> Include<T>(this IQueryable<T> query, params string[] navProperties) where T : class { foreach (var navProperty in navProperties) query = query.Include(navProperty); return query; } 

即使在通用的实现中也可以像这样使用它:

 string[] includedNavigationProperties = new string[] { "NavProp1.SubNavProp", "NavProp2" }; var query = context.Set<T>() .Include(includedNavigationProperties);