从EF核心中获得儿童实体的最大值



假设我有拥有订单的客户的公司。在一个搜索查询中,我想以"首先有最新订单的公司"来设置订单。(希望这足够清楚)。

.OrderByDescending(x =>
x.Customers.Max(c => c.Orders.Any() ? 
        y.Orders.Max(o => (DateTime?) o.DateCreatedUtc) 
        : DateTime.MinValue)
) 
  • 如果客户没有订单,请将最新订单日期视为DateTime.minvalue

目前我会收到此警告:无法翻译Linq表达式" max()",将在本地评估

我们可以重写以在服务器上评估的吗?

最初(我的歉意)看起来与在orderby中使用max()完全相同 - 请确保您使用 Max/ Min呼叫的外部(本质上是每个)的可无效的过载,然后获得翻译。

使用无效的过载仍然是必须的。但是,有一个隐藏的陷阱。 - 当前,EF Core只有在使用可选铸件的简单成员选择器时才能翻译聚合方法。任何其他表达式都会引起客户评估,无论类型是否可随意。

幸运的是,有一个简单的解决方案适用于除Average以外的所有标准聚合物 - 使用SelectMany弄平了聚合集(可能不超过一个,并且可以与参考导航属性结合)到包含聚合实体的级别并应用总体函数在该集合。

还确保不要在聚合选择器中使用条件或类似表达式。关于无效的Max/Min OVERLOADS的好处是,它返回为空集返回null,因此无需包括Any检查。null通常是第一个按顺序排列的,因此通常您不需要特殊的前哨值。即使您确实需要它们,请确保使用C#??操作员

love of aske sampe片段的可翻译版本为

.OrderByDescending(x => 
    x.Customers.SelectMany(c => c.Orders).Max(o => (DateTime?)o.DateCreatedUtc))
//                  ^                                  ^
//               drill down                    convert to nullable

相关内容

  • 没有找到相关文章

最新更新