好的,我有三层实体,具有以下层次结构:课程 - >模块 - >章
这是最初的EF LINQ声明:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters))
.Single(x => x.Id == id);
现在,我想要包含另一个名为Lab的实体,该实体与课程相关联。
如何包含实体实体?
我尝试了以下但是没有用:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
.Single(x => x.Id == id);
关于包含第二个实体的任何想法?
任何建议或信息都将受到高度赞赏。谢谢!
答案 0 :(得分:215)
您是否尝试过添加其他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是一个 Eager Loading 函数,它告诉Entity Framework您希望它包含来自其他表的数据。
Include语法也可以是字符串。像这样:
db.Courses
.Include("Module.Chapter")
.Include("Lab")
.Single(x => x.Id == id);
但LinqPad中的样本更好地解释了这一点。
答案 1 :(得分:22)
Include
是流畅界面的一部分,因此您可以编写多个Include
语句,每个语句都遵循其他语句
db.Courses.Include(i => i.Modules.Select(s => s.Chapters))
.Include(i => i.Lab)
.Single(x => x.Id == id);
答案 2 :(得分:16)
在实体框架核心(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();
答案 3 :(得分:2)
这是我的项目
var saleHeadBranch = await _context.SaleHeadBranch
.Include(d => d.SaleDetailBranch)
.ThenInclude(d => d.Item)
.Where(d => d.BranchId == loginTkn.branchId)
.FirstOrDefaultAsync(d => d.Id == id);
答案 4 :(得分:1)
可以写一个像这样的扩展方法:
/// <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);