为什么 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 中发生变化(不确定是否会包含给定的案例)
如果我有这样的 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 中发生变化(不确定是否会包含给定的案例)