2015-08-27 60 views
0

,如果我有这样的LINQ to SQL查询:为什么LINQ到SQL生成这个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比较与空永远是假的),但我不知道为什么的LINQ to SQL不使用stetement这样的:

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

这会工作。

我可以推LINQ to SQL来做到这一点吗?

+0

从技术上讲,SQL中与null的比较总是'unknown',而不是'false',否则'IF(NOT NULL = 1)'是真的,但事实并非如此。 'NULL = 1'是'unknown','NOT unknown'是'unknown',它不是'TRUE'。 –

回答

1

也许,你的状态,因为你必须考虑的SQL方式与LINQ to SQL的,而不是对象的方式...

这可能被视为一个bug或作为特征,顺便说一句.. 。

尤其是空值。

例如,nullable string的连接在linq到sql和linq到对象中是不同的。

假设a和b是字符串:

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

在LINQ to SQL中,如果为空,b是没有,A + B =空

在LINQ

到对象是否为空ANB b不是A + b = b

获得在LINQ to SQL相同的结果,你将不得不使用聚结操作select (a ?? string.Empty) + b

无论如何,你可以返回的名单和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对象想要的东西,你就必须做

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

编辑

这可能会ge在future versions(不知道是否包含给定的情况)