EF Core 3.1.4中LINQ查询报错:Include内Lambda表达式无效,求修正
修正EF Core 3.1的LINQ查询错误
错误原因
原查询出现Lambda expression used inside Include is not valid的核心问题:
- GroupBy导致Include失效:EF Core 3.1中,
GroupBy会将结果集转换为IGrouping类型,而Include仅对实体类型的查询生效,此时Include的Lambda表达式无法被正确解析。 - 重复Include同一导航属性:两次
Include(i => i.Ticket)的写法可能引发导航属性解析冲突。 - 分组取最新记录逻辑不准确:原代码先按组的最大创建时间排序组,再取组内第一条,无法保证组内取到的是最新的目标记录。
修正方案
方案一:子查询直接筛选最新记录
var histories = await _context.TicketHistories // 加载Ticket的Status和Priority属性 .Include(th => th.Ticket) .ThenInclude(t => t.Status) .Include(th => th.Ticket) .ThenInclude(t => t.Priority) .Where(th => ticketIds.Contains(th.TicketId) && th.Status.TicketStatusCode == "X" && th.Active && !th.Deleted && // 子查询判断当前记录是该工单下最新的符合条件的历史记录 th.Created == _context.TicketHistories .Where(w => w.TicketId == th.TicketId && w.Status.TicketStatusCode == "X" && w.Active && !w.Deleted) .Max(m => m.Created)) .ToListAsync();
方案二:预计算最新时间后关联查询(适合大数据量)
// 先预计算每个符合条件的工单的最新历史记录创建时间 var latestHistoryInfo = _context.TicketHistories .Where(w => ticketIds.Contains(w.TicketId) && w.Status.TicketStatusCode == "X" && w.Active && !w.Deleted) .GroupBy(g => g.TicketId) .Select(g => new { TicketId = g.Key, LatestCreated = g.Max(m => m.Created) }); // 关联查询获取对应记录并加载关联属性 var histories = await _context.TicketHistories .Include(th => th.Ticket) .ThenInclude(t => t.Status) .Include(th => th.Ticket) .ThenInclude(t => t.Priority) .Where(th => ticketIds.Contains(th.TicketId) && th.Status.TicketStatusCode == "X" && th.Active && !th.Deleted) .Join( latestHistoryInfo, th => new { th.TicketId, th.Created }, info => new { info.TicketId, info.LatestCreated }, (th, info) => th) .ToListAsync();
关键修改说明
- 规范
Include写法:通过两次Include(th => th.Ticket)分别链式ThenInclude加载Ticket的Status和Priority属性,避免重复解析冲突。 - 修正最新记录筛选逻辑:确保每个工单仅返回状态为X的最新历史记录,而非组内任意第一条。
- 规避GroupBy与Include的冲突:通过子查询或预计算关联的方式,让查询始终针对
TicketHistory实体,保证Include正常生效。
内容的提问来源于stack exchange,提问作者oz.grrta
相关产品推荐
相关产品推荐

