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 支持中的一个 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);