当我提出要求时,我才意识到这一点
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是如何以及为什么这样工作的。
答案 0 :(得分:1)
Substring()
不忽略null,在您的查询中,如果其中一个字符串为null,您将获得NullPointerException
并且如果其中一个字符串短于10符号,您将获得ArgumentOutOfRangeException
:
https://msdn.microsoft.com/library/aka44szs(v=vs.110).aspx
检查您的数据以及您的查询。
答案 1 :(得分:0)
涉及NULL的关系表达式实际上再次产生NULL。要过滤空值,您需要使用IS NULL
和IS NOT NULL
。您可以找到答案here。
答案 2 :(得分:0)
您可能希望添加一个标记,指示您的LinQ在后台连接到数据库以在那里执行SQL。没有这些信息,马克西姆是正确的。在简单的Linq-to-Objects C#中,您将获得适当的例外。
但是,当您的LinQ被翻译并作为SQL执行时,您刚刚遇到了一个令人惊讶的不直观的SQL特性:NULL永远不会等于。甚至不是NULL。并且NULL永远不会不等于到其他任何东西。甚至没有值或其他NULL。无论你将它与之比较,它只是从不在比较中产生真。
您可以使用IS
语法询问 是否为空。或者,您可以在执行语句之前将NULL替换为默认值。但是比较现有值和NULL总是会产生false
,因为NULL不等于任何东西,甚至不是NULL本身。