为什么Linq Substring()忽略空值

时间:2017-02-23 06:13:48

标签: c# sql .net string linq

当我提出要求时,我才意识到这一点

Orders.Where(y => y.Sub_Item_Id.Substring(0, 10) != y.Sub_Item_Site_Id.Substring(0, 10))

查询忽略y.Sub_Item_Site_Id中可能存在的所有空值。因此,当我在Sub_Item_Id中有一个值并且在Sub_Item_Site_Id中为null时,查询不会将其视为!=

为什么吗

我还用SQL

测试了相同的查询
select 
    *
from
    orders as o
where
    LEFT(o.sub_item_id, 10) <> LEFT(o.sub_item_site_id, 10)

我得到了同样的结果。我拥有所有不同的值,但是当我在o.sub_item_id中有一个值而在o.sub_item_site_id中为null时不是。

你能解释一下SQL和Linq是如何以及为什么这样工作的。

3 个答案:

答案 0 :(得分:1)

Substring() 忽略null,在您的查询中,如果其中一个字符串为null,您将获得NullPointerException并且如果其中一个字符串短于10符号,您将获得ArgumentOutOfRangeException

https://msdn.microsoft.com/library/aka44szs(v=vs.110).aspx

检查您的数据以及您的查询。

答案 1 :(得分:0)

涉及NULL的关系表达式实际上再次产生NULL。要过滤空值,您需要使用IS NULLIS NOT NULL。您可以找到答案here

答案 2 :(得分:0)

您可能希望添加一个标记,指示您的LinQ在后台连接到数据库以在那里执行SQL。没有这些信息,马克西姆是正确的。在简单的Linq-to-Objects C#中,您将获得适当的例外。

但是,当您的LinQ被翻译并作为SQL执行时,您刚刚遇到了一个令人惊讶的不直观的SQL特性:NULL永远不会等于。甚至不是NULL。并且NULL永远不会不等于到其他任何东西。甚至没有值或其他NULL。无论你将它与之比较,它只是从不在比较中产生真。

您可以使用IS语法询问 是否为空。或者,您可以在执行语句之前将NULL替换为默认值。但是比较现有值和NULL总是会产生false,因为NULL不等于任何东西,甚至不是NULL本身。