2009-05-27 13 views
2

このクエリは、Active = trueおよびExempt = falseのすべてのレコードのみを返します。それは、Active = trueおよびExempt IS NULLの場合でも、すべてのレコードを戻す必要があります。 .IsNotEqualToはnull値を持つレコードと比較しないと思いますか?デフォルトを設定せずにこれを回避する方法はありますか?.IsNotEqualToはNULLを比較しません

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は(免除が本当ではないか、nullである)ネストされた制約を取得するには、次のように:

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

1

NULLSは、SQLで

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

は、それはそれを言います? stringまたはboolには適用できません – Scott

+0

これはコンパイルエラーを引き起こし、And()はカラム名を文字列として取ります –

+0

gotcha。自分でそれを試していない、ちょうど私が持っていたアイデア。ありがとう。 –

2

"偽" であることを引き起こして、あなたのAND句に合体演算子を追加し、nullに適用される演算子は、trueまたはfalseを返しません - 代わりに、彼らはnullを返します。 (このルールの例外の1つは "IS"演算子です)。

つまり、式exempt != trueは、免除がtrueの場合はfalse、免除がfalseの場合はtrue、免除がnullの場合はnullになります。

あなたが偽またはnullの場合に免除あなたの条件に一致させたい場合は、あなたのようなクエリを作成する必要があります。

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

または

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

うまくいけば、これはあなたに何が起こっているかの洞察を与えますボンネットの下に。

+0

ありがとう、私はSQLでこれを行う方法を知っていた、ちょうどそれが亜音速にどのように翻訳されたか分からなかった! – Scott

関連する問題