首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么LINQ会生成此SQL语句以进行比较

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

Stack Overflow用户
提问于 2015-08-27 12:58:01
回答 1查看 42关注 0票数 0

如果我有这样的查询:

代码语言:javascript
运行
复制
var query = from x in db.XTable
            select x.y == 123; // the y column is nullable!
List<bool> list = query.ToList();

它将生成一个SQL语句,该语句将包含以下内容:

代码语言:javascript
运行
复制
(CASE 
    WHEN [t0].[y] = 123 THEN 1
    WHEN NOT ([t0].[y] = 123) THEN 0
    ELSE NULL
END)

这将引发错误,因为null无法分配给bool。我知道为什么会发生这种情况(因为SQL中与null的比较总是错误的),但我不知道为什么LINQ不使用这样的stetement:

代码语言:javascript
运行
复制
(CASE 
    WHEN [t0].[y] = 123 THEN 1
    ELSE 0
END)

这样就行了。

我可以按LINQ到SQL来完成这个任务吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-27 13:36:26

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

顺便说一句,它可能被认为是一种缺陷或者是一种特征.

尤其是空值。

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

假设a和b是字符串:

代码语言:javascript
运行
复制
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列表,这两个列表是:

代码语言:javascript
运行
复制
from x in db.XTable
select x.y != null && x.y == 123

代码语言:javascript
运行
复制
from x in db.XTable
select (x.y ?? 0) == 123

但是要想在linq中获得对象,就必须执行以下操作:

代码语言:javascript
运行
复制
from x in db.XTable.ToList()
select (x.y== null ? (bool?)null : x.y== 123))

编辑

这在未来版本中可能会发生变化(不确定是否包括给定的情况)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32250047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档