在使用ORDERBY MAX()(using Max() in Orderby)

2019-10-16 13:22发布

我有这行运行,直到我启用RelationalEventId.QueryClientEvaluationWarning。

下面让我们说我想要做的就是根据他们最新的订单日期的结果(客户)进行排序。

.OrderByDescending(x=>x.orders.Max(y=>y.CreateDate))

余配置上下文如下之后我意识到MAX()不转换为TSQL。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    base.OnConfiguring(optionsBuilder);
    optionsBuilder.ConfigureWarnings(warning =>
    {
        warning.Throw(RelationalEventId.QueryClientEvaluationWarning);
    });
}

错误:

InvalidOperationException: Error generated for warning 'Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning: The LINQ expression 'Max()' could not be translated and will be evaluated locally.

我想在本地计算最大是针对具有更好的性能。 有没有什么办法来计算SQL Server上最大?

Answer 1:

当您使用非可空类型调用LINQ查询汇总的方法(平均值,最小值,最大值),它别无选择,只能在本地进行评估。

为了避免这种情况,投你的最大价值,可空类型,它会在数据库中进行评估。

假设CREATEDATE是DateTime类型,它铸造日期时间? (可为空)应该工作。

这是你的查询应该是什么样子:

.OrderByDescending(x=>x.orders.Max(y=> (DateTime?)y.CreateDate)) 

这个答案来自官方GitHub库引用



Answer 2:

如果你有EF核心日志记录启用后,你会看到下面的警告:

=> Microsoft.EntityFrameworkCore.Query.RelationalQueryModelVisitor

可以预期使用在子查询中一个潜在的投掷骨料方法(最小,最大,中等)的。 客户评价将被使用,如果不存在数据操作将抛出。 更改子查询结果类型可空类型将允许全译本。

基本上,他们正试图保持在LINQ到对象这些骨料方法投掷行为​​。

而解决的办法是在最后一句。 例如,如果类型CreateDateDateTime ,然后

.OrderByDescending(x => x.orders.Max(y => (DateTime?)y.CreateDate))

将被转换为SQL。



文章来源: using Max() in Orderby