[英]Get Max from child entity in EF Core
假设我有一些公司,这些公司的客户都有订单。 在一个搜索查询中,我希望以“带最新订单的公司优先”的方式设置订单。 (希望这很清楚)。
.OrderByDescending(x =>
x.Customers.Max(c => c.Orders.Any() ?
y.Orders.Max(o => (DateTime?) o.DateCreatedUtc)
: DateTime.MinValue)
)
目前,我收到此警告: LINQ表达式“ Max()”无法翻译,将在本地进行评估
我们可以重写它以便在服务器上进行评估吗?
最初(我很抱歉)看起来与在Orderby中使用Max()完全相同 -确保您使用外部(基本上每个) Max
/ Min
调用可为空的重载,然后进行翻译。
仍然必须使用可为空的重载。 但是,这里有一个隐藏的陷阱。 -当前,EF Core只有在使用简单成员选择器和可选强制转换的情况下,才能转换聚合方法。 任何其他表达式都会导致客户端评估,而不管类型是否可为空。
幸运的是,有一个简单的解决方案适用于除“ Average
以外的所有标准聚合-使用SelectMany
将聚合集(可以大于一个,可以与参考导航属性组合)展平到包含聚合实体的级别,然后在该集合上应用聚合函数。
还要确保不在聚合选择器中使用条件表达式或类似表达式。 可空好事Max
/ Min
重载是返回null
的空集,所以没有必要列入Any
检查。 null
通常按顺序排在第一位,因此通常不需要特殊的哨兵值。 并且即使您确实需要它们,也请确保使用C#来应用它们??
聚合调用后的运算符。
话虽如此,示例代码段的可翻译版本是
.OrderByDescending(x =>
x.Customers.SelectMany(c => c.Orders).Max(o => (DateTime?)o.DateCreatedUtc))
// ^ ^
// drill down convert to nullable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.