EF Core 7中Linq Contains生成带额外OR IS NULL的SQL致查询变慢
EF Core 7生成
OR [列名] IS NULL条件的原因 EF Core 7 对Contains方法的SQL翻译逻辑做了语义修正:当传入的查询集合(比如你用到的labels列表)中包含null值时,框架会严格遵循LINQ的原生语义——list.Contains(null)本身就代表需要匹配数据表中该字段为null的所有记录,因此会自动在生成的SQL里追加OR ([a].[Label] IS NULL)的条件。
而在EF Core 6及更早版本中,框架对包含null的Contains处理存在语义偏差:要么直接忽略集合里的null值,要么没有生成对应的null匹配逻辑,所以之前即使列表混入null,也不会影响查询结果的范围。
你的场景里,因为项目未启用可空引用类型,labels列表意外混入null的问题没被提前发现,升级到EF Core7后,框架严格执行了LINQ的匹配语义,才导致查询返回了所有Label为null的记录,进而引发性能和结果范围的异常。
内容的提问来源于stack exchange,提问作者J Flex
相关产品推荐
相关产品推荐

