为什么LINQ-to-SQL会生成此SQL语句以进行比较

时间:2015-08-27 12:58:02

标签: linq linq-to-sql

如果我有这样的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不使用这样的stetement:

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

哪个会奏效。

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

1 个答案:

答案 0 :(得分:1)

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

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

特别是使用空值。

例如,可空string的连接在linq到sql和linq到对象之间是不同的。

假设a和b是字符串:

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

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

在linq to object中,如果a为null,则b b不是a + b = b

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

无论如何,您可以返回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对象,你必须做

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

修改

这可能会在future versions中更改(不确定是否包含给定的案例)