Linq 查询转换为 SQL 会弄乱空参数值

本文关键字:参数 会弄 SQL 查询 转换 Linq | 更新日期: 2023-09-27 17:56:08

下面是一个简单的 LINQ 查询:

var objs = db.Objects.Where(o => o.Field1 == val);

这转换为 SQL 查询:

select * from [Object] where Field1 = @p1

麻烦的是,val的值也可以合法地为空。 SQL不喜欢比较空值;它坚持语法... where Field1 is null

除了使用??/isnull操作之外,有没有办法巧妙地做到这一点?

Linq 查询转换为 SQL 会弄乱空参数值

这又是 LINQ 支持中的一个 EF 弱点。老式的 LINQ to SQL 根据 val 的运行时值正确转换了它。

我建议你这样做:

var objs = db.Objects.Where(
   o => (o.Field1 == val) || (o.Field1 == null && val == null));

如果 EF 逐个转换此模式,则 SQL Server 查询优化器实际上将选取此模式并将其优化为"等于空值"检查。您甚至可以使用此代码模式查找索引,它只是有效。在查询计划中,这与EQ相反显示为IS

怎么样。有价值吗?

var objs = db.Objects.Where(o => !o.Field1.HasValue && o.Field1 == val);