好吧,我有以下层次三层次的实体:课程 - >模块 - >第二章
这里是原来的EF LINQ语句:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters))
.Single(x => x.Id == id);
现在,我想包括所谓的实验室的另一个实体,与课程相关的。
如何包括实验室实体?
我尝试以下,但它没有工作:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
.Single(x => x.Id == id);
在包括第二实体的任何想法?
任何一块提醒或信息将高度赞赏。 谢谢!
您是否尝试只需添加另一个Include
:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters))
.Include(i => i.Lab)
.Single(x => x.Id == id);
因为您的解决方案失败, Include
不采取布尔逻辑运算符
Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
^^^ ^ ^
list bool operator other list
更新要了解更多信息,请下载LinqPad并通过样品的样子。 我认为这是熟悉的LINQ和Lambda的最快方式。
作为一个开始-之间的区别Select
,并Include
是与一个选择,你决定要返回(又名投影) 的东西 。 在include是一个预先加载的功能,告诉你希望它包括来自其他表中的数据实体框架。
在包括语法,也可以在字符串。 像这样:
db.Courses
.Include("Module.Chapter")
.Include("Lab")
.Single(x => x.Id == id);
但在样品LinqPad解释这更好的。
Include
精通接口的一部分,所以你可以写多个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);
在实体框架核心( EF.core
),可以使用.ThenInclude
为包括下一个水平。
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.ToList();
更多信息: https://docs.microsoft.com/en-us/ef/core/querying/related-data
注意:假设您需要多个ThenInclude()
上blog.Posts
,重复刚才的Include(blog => blog.Posts)
做一套ThenInclude(post => post.Other)
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.Include(blog => blog.Posts)
.ThenInclude(post => post.Other)
.ToList();
有人可能会这样写一个扩展方法:
/// <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);