如果我有这样的查询:
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不使用这样的stetement:
(CASE
WHEN [t0].[y] = 123 THEN 1
ELSE 0
END)这样就行了。
我可以按LINQ到SQL来完成这个任务吗?
发布于 2015-08-27 13:36:26
可能,正如您所述,因为您必须考虑使用linq到sql的SQL方式,而不是对象方式.
顺便说一句,它可能被认为是一种缺陷或者是一种特征.
尤其是空值。
例如,在linq到sql和linq对对象的连接中,可空string的连接是不同的。
假设a和b是字符串:
from n in db
select n.a + n.b在linq to sql中,如果a为空,b不为,则a+b=空。
在linq to object中,如果a为空,则b不是a+b=b
要在linq中获得相同的结果,您必须使用聚合操作符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))编辑
这在未来版本中可能会发生变化(不确定是否包括给定的情况)
https://stackoverflow.com/questions/32250047
复制相似问题