为什么 LINQ-to-SQL 生成这个 SQL 语句进行比较

Why does LINQ-to-SQL generate this SQL statement for a comparison

如果我有这样的 LINQ to SQL 查询:

var query = from x in db.XTable
            select x.y == 123; // the y column is nullable!
List<bool> list = query.ToList();

它将生成一个 SQL 包含以下内容的语句:

(CASE 
    WHEN [t0].[y] = 123 THEN 1
    WHEN NOT ([t0].[y] = 123) THEN 0
    ELSE NULL
END)

这将引发错误,因为 null 无法分配给 bool。我知道为什么会这样(因为 SQL 中与 null 的比较总是错误的)但我不知道为什么 LINQ to SQL 不使用这样的语句:

(CASE 
    WHEN [t0].[y] = 123 THEN 1
    ELSE 0
END)

哪个可行。

我可以将 LINQ 推送到 SQL 来执行此操作吗?

可能,如您所说,因为您必须考虑使用 linq 到 sql 的 SQL 方式,而不是对象方式...

顺便说一下,它可能被视为错误或功能...

尤其是空值。

例如,可空 string 的串联在 linq to sql 和 linq to objects 中是不同的。

假设 a 和 b 是字符串:

from n in db
select n.a + n.b

在 linq to sql 中,如果 a 为 null 而 b 不为 null,则 a + b = null

在 linq to object if a is null anb b is not a + b = b

要在 linq to sql 中获得相同的结果,您必须使用合并运算符 select (a ?? string.Empty) + b

无论如何,您可以 return Nullable<bool> 列表和 bool 列表,即:

from x in db.XTable
select x.y != null && x.y == 123

from x in db.XTable
select (x.y ?? 0) == 123

但是要在 linq to objects 中得到你想要的东西,你必须这样做

from x in db.XTable.ToList()
select (x.y== null ? (bool?)null : x.y== 123))

编辑

这可能会在 future versions 中发生变化(不确定是否会包含给定的案例)