7

我有一个 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();
}

现在由于某种原因,当我为 parentID 传入 null 时(当前只有具有 null parentID 的数据)并且我没有得到任何结果。

我将此查询复制并粘贴到 LinqPad 中并运行以下命令:

from doc in dbContext.Documents
where doc.ParentID == null
select doc

我按预期返回结果集...

实际查询已离开联接和其他联接,但我已将它们删除并对其进行测试并获得相同的结果,因此联接不会影响任何事情。该应用程序和 LinqPad 也都连接到同一个数据库。

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

4

2 回答 2

19

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

where doc.ParentID == parentID || (doc.ParentID == null && parentID == null)
于 2009-07-28T15:42:12.993 回答
0

您也可以使用类似...

from doc in dbContext.Documents
where doc.IsParentIDNull()
select doc

它对我有用!希望它对你有用!

于 2009-11-27T13:54:21.077 回答