【发布时间】:2020-05-01 06:18:27
【问题描述】:
我有一个嵌套数据模型,我想从中获取按顶级属性分组的聚合数据。 我的模型例如:
public class Scan {
public long Id {get; set;}
public int ProjectId { get; set; }
public int ScanUserId { get; set; }
public ICollection<ScanItem>? Items { get; set; }
}
public class ScanItem
{
public long Id { get; set; }
public long InventoryScanId { get; set; }
public double Qty { get; set; }
}
我想获取按 Scan.ScanUserId 分组的所有扫描,然后获取 ScanItems.Qty 的总和,例如每个用户。我的查询看起来像这样,EF 给出了以下错误:
处理 LINQ 表达式 'AsQueryable((Unhandled 参数:x).Items)' by 'NavigationExpandingExpressionVisitor' 失败
from scan in Scans
.Include(x=>x.ScanUser)
.Include(x=>x.Items)
group scan by new { scan.ScanUser.Name, scan.ScanUser.Id } into g
select new
{
UserId = g.Key.Id,
Name = g.Key.Name,
LastSyncTime = g.Max(x => x.ScanDate),
ScanItems = g.Sum(x=>x.Items.Sum(i=>i.Qty))
}
如何在嵌套表的属性上运行聚合函数而不在客户端对其进行评估?
【问题讨论】:
-
我认为
Includes是不必要的。另外,为什么Items可以为空?您可以更改为:public ICollection<ScanItem> Items { get; set; } = new List<ScanItem>();如果 Linq-to-SQL 尝试在null集合上调用Sum,您将收到错误消息。 -
@crgolden 你说得对,包含是不必要的,集合不应为空,但它没有帮助。
-
是的,我相信这可能是因为内部
Sum在这里本质上被视为一种回调,因为它本质上是Func内的Func。在构建最终的select
标签: c# entity-framework asp.net-core entity-framework-core ef-core-3.1