为何带Where条件的C# LINQ求最值查询执行失败?
问题原因分析
你的这两句EF Core代码抛出System.InvalidOperationException的核心问题是:EF Core的LINQ查询翻译器会忽略DefaultIfEmpty与聚合函数(Max/Min)的组合逻辑,导致你设置的默认值根本没生效。
具体来说:
- 当
Where条件过滤后没有匹配的数据库行时,你期望DefaultIfEmpty(0)(或99999)能生成一个包含默认值的序列,再通过Max()/Min()拿到默认值。 - 但EF Core在将这段LINQ翻译成SQL时,会直接生成不带
DefaultIfEmpty逻辑的聚合查询,比如第一句对应的SQL大概是:SELECT MAX([SourceColumn]) FROM [SourceTable] WHERE [SourceColumn] <= @targetFromValue - 当查询结果为空时,SQL的
MAX()函数会返回NULL,而如果你把这个NULL赋值给非可空数值类型(比如int)的变量,EF Core就会抛出InvalidOperationException——因为它无法将数据库返回的NULL转换为.NET的非空值类型。
简单说,你的默认值设置被EF Core的SQL优化给跳过了,实际执行的查询在无结果时返回NULL,触发了类型转换异常。
内容的提问来源于stack exchange,提问作者Big_Al_Tx
相关产品推荐
相关产品推荐

