代码之家  ›  专栏  ›  技术社区  ›  Kelsey

LINQ查询使用的是空值,但不是int?在哪里条款

  •  7
  • Kelsey  · 技术社区  · 15 年前

    我有一个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传入空值(当前只有parentID为空的数据)时,我没有得到任何结果。

    我将此查询复制并粘贴到LinqPad中,然后运行以下操作:

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

    我得到了预期的结果集…

    实际上查询已经离开了join和其他join,但是我已经删除了它们并对其进行了测试,得到了相同的结果,所以join不会影响任何东西。app和linqpad都连接到同一个db。

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

    2 回复  |  直到 15 年前
        1
  •  19
  •   kvb    15 年前

    字面意义的 null 值的处理方式与可以为空的参数不同。当你明确测试 无效的 ,生成的SQL将使用 IS NULL 运算符,但当使用参数时,它将使用标准 = 运算符,表示没有行匹配,因为在SQL中 无效的 不等于任何东西。这是Linq to SQL中比较烦人的.NET/SQL语义不匹配之一。要解决这个问题,您可以使用如下子句:

    where doc.ParentID == parentID || (doc.ParentID == null && parentID == null)
    
        2
  •  0
  •   Tokstow    15 年前

    你也可以使用类似…

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

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