【问题标题】:Linq query works with null but not int? in where clauseLinq 查询适用于 null 但不适用于 int?在 where 子句中
【发布时间】:2009-07-28 15:25:32
【问题描述】:

我有一个 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 与 int?我已经更新了问题,以便其他有相同问题的人找到此线程。

【问题讨论】:

  • 您是否尝试过使用 null 而不是可以为 null 的 parentID 来修改您的编译代码?我的猜测是 LINQ 正在对可为空的 int 进行某种类型推断,并且没有正确处理 null 大小写……但我不确定,所以我不会作为答案发布。
  • 不,我还没有尝试过。目前无法访问代码来测试东西,直到今天晚些时候。我会尝试,但如果它有效,它仍然不能解决传入可为空的 int 的问题。我还将比较两个查询生成的 SQL,一位同事提到我也应该尝试一下。它仍然不能解决我的问题。

标签: c# linq linq-to-sql linqpad


【解决方案1】:

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

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

【讨论】:

  • 这在我的测试场景中可以帮助 OP。这个解决方案效果很好!
【解决方案2】:

你也可以使用类似 ...

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多