如果我有这样的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来执行此操作吗?
答案 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中更改(不确定是否包含给定的案例)