[英]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.