我有一个linq查询函数,如(简化):
public IList<Document> ListDocuments(int? parentID)
{
return (
from doc in dbContext.Documents
where doc.ParentID == parentID
select new Document
{
ID = doc.ID,
ParentID = doc.ParentID,
Name = doc.SomeOtherVar
}).ToList();
}
现在出于某种原因我为父ID传递了null(目前只有空父ID的数据)并且没有结果。
我将此查询复制并粘贴到LinqPad中并运行以下命令:
from doc in dbContext.Documents
where doc.ParentID == null
select doc
我按预期收回结果集......
实际查询已经离开了连接和其他连接但是我已经删除它们并测试它并获得相同的结果,因此连接不会影响任何东西。应用程序和LinqPad也连接到同一个数据库。
编辑:在应用查询中仅使用'null'进行测试,并按预期返回结果,因此问题是使用null vs int?。我已经更新了一些问题,以便对遇到相同问题的其他人更有用,可以找到这个帖子。
答案 0 :(得分:19)
文字null
值的处理方式与可能为null的参数的处理方式不同。当您对null
进行显式测试时,生成的SQL将使用IS NULL
运算符,但是当您使用参数时,它将使用标准=
运算符,这意味着没有行匹配因为在SQL中null
不等于任何东西。这是LINQ to SQL中令人烦恼的.NET / SQL语义不匹配之一。要解决它,您可以使用如下的子句:
where doc.ParentID == parentID || (doc.ParentID == null && parentID == null)
答案 1 :(得分:0)
你也可以使用......
from doc in dbContext.Documents
where doc.IsParentIDNull()
select doc
它对我有用! 希望它对你有用!