【发布时间】:2022-01-12 23:12:35
【问题描述】:
这更像是一个语法问题,而不是实际的错误或错误,因为我终于得到了我想要的工作。但我想了解并改进我当前的解决方案。
架构
假设我有一个Users 表,与表Posts 具有一对多关系,还有一个Authors 的一对一关系表——每个Post 一个。
我想编写一个自定义存储库函数来获取所有Users、所有Posts、每个Author 每个Post。
尝试 #1(不起作用)
我想我可以这样做:
public IQueryable<User> GetUsersWithPostsAndAuthors()
{
var query = GetAll();
// include all details on user object
return query
.Include(user => user.Posts.Select(x => x.Author));
}
它似乎不包括Author 实体。实际上,我收到以下错误:
Lambda expression used inside Include is not valid.
尝试 #2(也不起作用)
然后我想也许那些Posts需要先在查询中,所以我尝试了这个:
public IQueryable<User> GetUsersWithPostsAndAuthors()
{
var query = GetAll();
// include all details on user object
return query
.Include(user => user.Posts)
.Include(user => user.Posts.Select(x => x.Author)
}
不幸的是,我得到了同样的错误:
Lambda expression used inside Include is not valid.
尝试 #3(成功!)
但是,如果我使用Include 的版本,您可以提供string navigationPropertyPath(实际上我不喜欢它,因为它只是一个硬编码的字符串),如下所示:
public IQueryable<User> GetUsersWithPostsAndAuthors()
{
var query = GetAll();
// include all details on user object
return query
.Include(user => user.Posts)
.Include("Posts.Author");
}
查询按预期工作!
这里发生了什么?我认为Select 投影与Include 的作用相同。 (而且 Stackoverflow 上似乎有一些答案暗示了这一点。)
更重要的是,有没有一种方法可以实现我想要的,而无需在 Include 调用中对 Posts.Author 进行硬编码?我想在这里进行静态类型检查。
【问题讨论】:
-
query.Include(user => user.Posts).ThenInclude(post => post.Author)是您正在寻找的。您可以在 Microsoft Docs 中找到此文档以及更多详细文档