Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询可以使用null,但不能使用int?在where子句中_C#_Linq_Linq To Sql_Linqpad - Fatal编程技术网

C# Linq查询可以使用null,但不能使用int?在where子句中

C# Linq查询可以使用null,但不能使用int?在where子句中,c#,linq,linq-to-sql,linqpad,C#,Linq,Linq To Sql,Linqpad,我有一个linq查询函数,如(简化): 我得到了预期的结果集 实际上,查询已经离开了连接和其他连接,但我已经删除了它们并对其进行了测试,得到了相同的结果,因此连接不会影响任何东西。应用程序和LinqPad也连接到同一个DB 编辑:在应用程序查询中仅使用“null”进行测试,并按预期返回结果,因此问题使用null vs int?。我已经更新了这个问题,以使其他有相同问题的人更容易找到这个线程。Literalnull值的处理方式与可能为null的参数不同。当您针对null进行显式测试时,生成的SQL

我有一个linq查询函数,如(简化):

我得到了预期的结果集

实际上,查询已经离开了连接和其他连接,但我已经删除了它们并对其进行了测试,得到了相同的结果,因此连接不会影响任何东西。应用程序和LinqPad也连接到同一个DB


编辑:在应用程序查询中仅使用“null”进行测试,并按预期返回结果,因此问题使用null vs int?。我已经更新了这个问题,以使其他有相同问题的人更容易找到这个线程。

Literal
null
值的处理方式与可能为null的参数不同。当您针对
null
进行显式测试时,生成的SQL将使用
IS null
运算符,但当您使用参数时,它将使用标准的
=
运算符,这意味着没有行匹配,因为在SQL
null
中不等于任何值。这是LINQ到SQL中更恼人的.NET/SQL语义不匹配之一。要解决此问题,可以使用以下子句:

where doc.ParentID == parentID || (doc.ParentID == null && parentID == null)

你也可以使用像

from doc in dbContext.Documents
where doc.IsParentIDNull()
select doc
这对我有用!
希望它对你有用

您是否尝试过使用null而不是可为null的parentID修改编译后的代码?我猜LINQ正在对可为null的int进行某种类型的推断,并且没有正确处理null的情况……但是我不确定,所以我不会发布答案。不,我还没有尝试过。目前,直到今天晚些时候,我们才可以访问代码来测试东西。我会尝试这样做,但如果可行,它仍然无法解决传递可为null的int的问题。我还将比较两个查询生成的SQL,一位同事提到我也应该尝试这样做。但它也不能解决我的问题。这在我的测试场景中起到了帮助OP的作用。这个解决方案非常有效!
where doc.ParentID == parentID || (doc.ParentID == null && parentID == null)
from doc in dbContext.Documents
where doc.IsParentIDNull()
select doc