这是一个简单的 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 查询:
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 查询优化器实际上会选择此模式并将其优化为“等于空值”检查。您甚至可以使用此 Code Pattern 查找索引,它可以正常工作。在查询计划中IS
,这与EQ
.
.HasValue怎么样?
var objs = db.Objects.Where(o => !o.Field1.HasValue && o.Field1 == val);