c# - 为什么 LINQ SelectMany 忽略包含? (实际上删除了加载的数据)

标签 c# sql linq lazy-loading

var result = ParentTable.Set
.Include("Children")
.Include("Children.GrandChildren")
.SelectMany(p=>p.Children)
.Where(c=>c.GrandChildren.Any(whatever))

将返回 null,即使

var result = ParentTable.Set
.Include("Children")
.Include("Children.GrandChildren")

里面有完全填充的数据。

需要做的

 var result = ParentTable.Set
.SelectMany(p=>p.Children)
.Include("GrandChildren")
.Where(c=>c.GrandChildren.Any(whatever))

这个例子有点做作,但我在一个更大更复杂的查询中遇到了这个问题,其中子选择投影使用 SelectMany 将计数填充到特定属性中,其他数据被投影到其他属性中在 selectMany 之外,这些属性正在填充,但 selectmany 计数没有。查询的不同部分如何延迟加载同一数据的不同部分,这让人非常困惑!

最佳答案

您应该使用 ThenInclude 来获取子项。 我会将您的查询重写为:

var result = ParentTable.Set
.Include(p => p.Children)
.ThenInclude(c => c.GrandChildren.Where(gc => gc.whatver))
.SelectMany(p => p.Children)

关于c# - 为什么 LINQ SelectMany 忽略包含? (实际上删除了加载的数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39731930/

相关文章:

c# - 我可以在属性中指定路径以将我的类中的属性映射到我的 JSON 中的子属性吗?

mysql - 在 MySQL 数据库中允许非 ascii 字符

MySQL查询嵌套where条件

linq - NHibernate.Linq赞

c# - 在 C# 中,如何使用另一个列表的 StartsWith() 条件筛选列表?

c# - 有没有办法使用 LINQ 将重复项目的集合与其子集合合并?

c# - UWP 创建 VPN 连接

c# - 无锁多线程适合真正的线程专家

c# - 你选择什么, protected 还是内部的?

mysql - SQL:泛化查询