c# - Linq 查询转换为 SQL 弄乱了空参数值

标签 c# sql-server linq entity-framework

这是一个简单的 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/

相关文章:

c# - 注入(inject)依赖项的正确方法

c# - 使 EF 使用 App_Data 文件夹中的本地数据库

asp.net - 无效的列名 : SQL/ASP. NET

sql - sql server如何使用管道字符进行排序

c# - 使用c#进行聚合分组

c# - IEnumerable<T> 在调用 Count() 或 Any() 之前有结果

c# - C#中 "this"是什么意思

sql - T-SQL 查询在声明整数与计算查询时给出不同的结果

c# - IEquatable<T>.Equals 中的条件

c# - 将网站作为包部署到 azure