2013-08-06 92 views
6

讓我們考慮一個包含2列的表:ID(int)和Role(字符串)。兩者都是可空的。當where子句與NULL值比較時,LINQ-to-SQL查詢不返回行

現在假設兩列中的數據是:

ID  Role 
--  ---- 
1  NULL 
2  Admin 

查詢看起來是這樣的:

List<types> t1 = (
    from a in datacontext.RoleTable 
    where a.Role != "Admin" 
    select a 
).ToList(); 

我想上面的查詢應該返回表的第一條記錄爲其Role列不等於'Admin',但查詢返回一個空列表。

現在,當我使用這個查詢:

List<types> t2 = (
    from a in datacontext.RoleType 
    where a.Role != "Admin" && a.Role == DBNull.Value.ToString() 
    select a 
).ToList(); 

我得到正確的答案。

有誰能告訴我爲什麼第一個查詢不起作用請。

僅供參考:如果表中第一行的角色列更改爲User而不是NULL,則第一個查詢正常工作。

我正在使用SQL Express和LINQ to SQL。

+0

你試過'.Equals()'? –

+0

沒有那不是我想知道爲什麼第一個查詢不按預期行事。 –

回答

10

第一個查詢並不像預期的那樣,因爲它被翻譯成SQL等同於以下內容:

select * from RoleTable where Role != 'Admin' 

現在,在SQL NULL != 'Admin'TRUE(也不是FALSE - 它是未定義的)。
這是LINQ to SQL提供的抽象漏洞多且您仍需要知道SQL的許多情況之一。

順便說一句:您的第二個查詢也是不正確的,它將只選擇那些行是null。它不會選擇角色爲'User'的行。

正確的查詢應該是這樣的:

List<types> t2 = 
    (from a in datacontext.RoleTable 
    where a.Role != "Admin" || a.Role == null 
    select a).ToList(); 
+0

純粹的好奇心 - 什麼是SQL中的NULL!='Admin''?當然不是'假'? – Andrei

+5

@Andrei:沒有定義。這既不是真的也不是假的。 –

+0

供參考:第二個查詢返回第一個記錄,因爲它不等於「管理員」,它等於dbnull –

相關問題