这是一个简单的 LINQ 查询:
var objs = db.Objects.Where(o => o.Field1 == val);
这转换为 SQL 查询:
select * from [Object] where Field1 = @p1
问题是,val
的值也可以合法地为 null。 SQL 不喜欢比较空值;它坚持语法 ... 其中 Field1 为空
。
除了使用 ??
/isnull
操作之外,有什么方法可以巧妙地做到这一点?
最佳答案
这又是 EF 在 LINQ 支持方面的弱点。良好的旧 LINQ to SQL 根据 val 的运行时值正确翻译了这一点。
我建议你这样做:
var objs = db.Objects.Where(
o => (o.Field1 == val) || (o.Field1 == null && val == null));
如果 EF 按字面意思翻译它,SQL Server 查询优化器实际上会选择这种模式并将其优化为“等于空值”检查。您甚至可以使用此代码模式查找索引,它非常有效。在查询计划中,这显示为 IS
,与 EQ
形成对比。
关于c# - Linq 查询转换为 SQL 弄乱了空参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14548261/