簡體   English   中英

Linq查詢使用null但不是int? 在where子句中

[英]Linq query works with null but not int? in where clause

我有一個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?。 我已經更新了問題,使其對具有相同問題的其他人更有用,可以找到這個帖子。

Literal null值的處理方式與可能為null的參數的處理方式不同。 當您顯式測試null ,生成的SQL將使用IS NULL運算符,但是當您使用參數時,它將使用standard =運算符,這意味着沒有行匹配,因為在SQL中null不等於任何內容。 這是LINQ to SQL中令人煩惱的.NET / SQL語義不匹配之一。 要解決它,您可以使用如下的子句:

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

你也可以用...

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM