1

我有下面的方法存在問題:爲什麼這個LINQ to EF查詢不起作用?

public IQueryable<Customer> ListCustomers(int? parentId) 
{ 
    Debug.Assert(parentId == null); 
    //var list = _customerRepository.List().Where(c => c.ParentId == null); 
    var list = _customerRepository.List().Where(c => c.ParentId == parentId); 
    return list; 
} 

我有我的數據庫爲NULL的ParentId一個客戶。當我使用ListCustomers(null)調用方法時,list對於return語句是空的。如果我使用硬編碼的空值交換註釋掉的行並查詢,則列表包含我的一個客戶。

什麼會導致這兩個查詢之間的差異?爲什麼c.ParentId == parentId沒有返回任何東西?

回答

0

與你必須使用這樣可空類型:

.Where(c=> object.Equals(c.ParentId, parentId)) 
+0

當'parentId'有一個值時,我用這個解決方案得到一個EF'NotSupportedException'。其他人能證實這一點嗎? –

1

EF翻譯與int?您的查詢是這樣的:

DECLARE @parentId Int = null 
SELECT ... WHERE ParentId = @parentId 

當這在數據庫上執行,它不會做你期望的,因爲SQL [column] = NULL總是錯誤的。

我同意EF能勝任這個更好,但作爲一種解決方法,你可以寫這樣的:那麼

.Where(c => !parentId.HasValue 
    ? !c.ParentId.HasValue 
    : c.ParentId.Value == parentId.Value 
) 

EF會產生一個(有點繁瑣)SQL語句的正確IS NULL謂詞。