.NET 8中Select查询用new[]抛出InlineQueryRootExpression异常求助
问题描述
以下代码在 .NET 7 及 Microsoft.EntityFrameworkCore.SqlServer 7.0.13 环境可正常运行:
Updated = p.ThreatAndCountermeasures.Count() > 0 ? new[] { p.Updated, p.ThreatAndCountermeasures.Max(tac => tac.Updated) }.Max() : p.Updated,
但升级至 .NET 8 及 Microsoft.EntityFrameworkCore.SqlServer 8.0.0 后,抛出如下异常:
查询根类型“InlineQueryRootExpression”未被提供程序代码处理。当在不支持的提供程序上使用特定于提供程序的方法时会发生此问题。
解决方案
EF Core 8对查询表达式的解析逻辑做了调整,原代码中创建内联数组再调用Max()的写法会被解析为内联查询根,而SqlServer提供程序暂不支持这种处理方式。可以通过以下方式重构代码:
方式1:直接条件比较最大值
Updated = p.ThreatAndCountermeasures.Any() ? (p.Updated > p.ThreatAndCountermeasures.Max(tac => tac.Updated) ? p.Updated : p.ThreatAndCountermeasures.Max(tac => tac.Updated)) : p.Updated,
方式2:使用DbFunctions.IIF简化写法
Updated = DbFunctions.IIF( p.ThreatAndCountermeasures.Any(), DbFunctions.IIF(p.Updated > p.ThreatAndCountermeasures.Max(tac => tac.Updated), p.Updated, p.ThreatAndCountermeasures.Max(tac => tac.Updated)), p.Updated ),
方式3:提前获取子集合最大值减少重复查询
var query = from p in context.YourEntities let maxTacUpdated = p.ThreatAndCountermeasures.Max(tac => (DateTime?)tac.Updated) select new { // 其他字段 Updated = maxTacUpdated.HasValue ? (p.Updated > maxTacUpdated.Value ? p.Updated : maxTacUpdated.Value) : p.Updated };
注:如果ThreatAndCountermeasures可能为空,需用可空类型接收子集合的最大值,避免空引用异常。
内容的提问来源于stack exchange,提问作者Ogglas
相关产品推荐
相关产品推荐

