1

次の方法に問題があります。

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;
}

私の DB には、ParentId が null の Customer が 1 つあります。でメソッドを呼び出すとListCustomers(null)listreturn ステートメントに対して空になります。コメントアウトされた行を交換し、ハードコーディングされた null でクエリを実行すると、リストには 1 人の顧客が含まれます。

この 2 つのクエリの違いの原因は何ですか? c.ParentId == parentId何も返さないのはなぜですか?

4

3 に答える 3

1

EF は、クエリint?を次のように変換します。

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

[column] = NULLこれがデータベースで実行されると、SQLは常に falseであるため、期待どおりの結果が得られません。

EFがこれをより適切に処理できることに同意しますが、回避策として、次のように書くことができます:

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

IS NULL次に、EF は、正しい述語を使用して (やや冗長な) SQL ステートメントを生成します。

于 2012-12-08T12:47:25.043 に答える
1

Nullable 型であるため、linq プロバイダーは適切な IS NULL チェックを生成しません。詳細については、この回答を参照してください: https://stackoverflow.com/a/785501/1195510

于 2012-12-08T12:28:10.953 に答える
0

null 許容型では、次のように使用する必要があります。

 .Where(c=> object.Equals(c.ParentId, parentId))
于 2012-12-08T12:28:51.180 に答える