You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core+MySQL中Where子句调用MaxBy无法翻译的解决方案

问题原因

EF Core 目前未对 MaxBy() 扩展方法提供内置的数据库查询翻译支持,因此你在Select中调用MaxBy()时无法生成合法的MySQL语句,会直接抛出翻译异常。

正确实现

将MaxBy()的逻辑替换为EF Core可识别的「按时间戳倒序取第一条」的等价写法即可,修改后的代码如下:

public class TicketSummary
{
    public int TicketId {get;set;}
    public Employee LatestEmployee {get;set;}
}

public IQueryable<TicketSummary> BuildSummaryQuery()
{
    return _context.Tickets.Select(t => new TicketSummary
        {
            TicketId = t.Id,
            // 等价于MaxBy(x=>x.Timestamp).Employee逻辑,EF Core可正常翻译为SQL
            LatestEmployee = t.Histories
                .OrderByDescending(h => h.Timestamp)
                .Select(h => h.Employee)
                .FirstOrDefault()
        });
}

逻辑说明

  • 上述写法和你原本的MaxBy计算逻辑完全一致:都是取工单关联的操作历史中,时间戳最新的一条记录对应的操作人员
  • EF Core会将这段逻辑翻译为MySQL的相关子查询,通过ORDER BY Timestamp DESC LIMIT 1实现取最新记录的逻辑,全程在数据库端执行,不会加载全量数据到内存,性能符合预期
  • 你后续在该IQueryable上追加的筛选条件(比如按LatestEmployee.Name过滤)也会被一同翻译为SQL,不会再抛出翻译异常,示例调用如下:
// 该查询可正常执行,生成带过滤条件的合法MySQL语句
var batmanTickets = BuildSummaryQuery()
    .Where(x => x.LatestEmployee.Name == "Batman")
    .ToList();
注意事项

不要通过调用.AsEnumerable()、.ToList()等方法提前将查询执行到内存后再做筛选,这种写法会把全量工单数据加载到应用内存后再过滤,数据量较大时会产生严重的性能问题。

内容的提问来源于stack exchange,提问作者Artur S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:15:33