2009-05-27 41 views
2

此查詢將僅返回Active = true和Exempt = false的所有記錄。它應該返回任何記錄,其中Active = true和Exempt IS NULL。我想.IsNotEqualTo不會與任何帶空值的記錄進行比較?沒有設置默認值,有沒有辦法解決這個問題?.IsNotEqualTo不會比較空值

UserCollection ActiveUsersNotExempt = new UserCollection(); 
ActiveUsersNotExempt = DB.Select().From<User>() 
       .Where(User.Columns.Active).IsEqualTo(true) 
       .And(User.Columns.Exempt).IsNotEqualTo(true) 
       .ExecuteAsCollection<UserCollection>();` 

回答

4

使用AndExpression如下得到一個嵌套的約束(豁免是不正確或爲空):

UserCollection ActiveUsersNotExempt = DB.Select().From<User>() 
    .Where(User.Columns.Active).IsEqualTo(true) 
    .AndExpression(User.Columns.Exempt).IsNotEqualTo(true) 
    .Or(User.Columns.Exempt).IsNull() 
    .ExecuteAsCollection<UserCollection>();` 
+0

謝謝,這是我需要的。 – Scott 2009-05-27 16:22:33

1

添加合併運算會向您和條款,造成NULLS是 「假」

.And(User.Columns.Exempt ?? false).IsNotEqualTo(true) 
+0

它說?不能應用於字符串或布爾型 – Scott 2009-05-27 16:13:03

+0

這將導致編譯錯誤,並且()需要將列名作爲字符串 – 2009-05-27 16:15:00

+0

陷入困境。沒有自己嘗試過,只是我的一個想法。謝謝。 – 2009-05-27 16:19:48

2

在SQL中,運營商應用到空不返回TRUE或FALSE - 相反,他們返回null。 (這個規則的一個例外是「IS」操作符)。

也就是說,表達式exempt != true在exempt爲true時爲false,在exempt爲false時爲true,在exempt爲null時爲null。

如果你想匹配您的條件豁免時是虛假或無效,則需要建立類似的查詢:

active = true AND (exempt = false OR exempt IS NULL) 

active = true AND COALESCE(exempt, false) = false 

希望這個給你一些洞察到這是怎麼回事在引擎蓋下。

+0

謝謝,我知道如何在SQL中做到這一點,只是不知道它是如何轉化爲亞音速! – Scott 2009-05-27 16:23:46