4

这是一个简单的 LINQ 查询:

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

这转化为 SQL 查询:

select * from [Object] where Field1 = @p1

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

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

4

2 回答 2

4

这又是 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.

于 2013-01-27T14:23:42.117 回答
0

.HasValue怎么样?

var objs = db.Objects.Where(o => !o.Field1.HasValue && o.Field1 == val);
于 2013-01-27T15:39:15.350 回答