7

私は(簡略化された)のようなlinqクエリ関数を持っています:

public IList<Document> ListDocuments(int? parentID)
{
    return (
        from doc in dbContext.Documents
        where doc.ParentID == parentID
        select new Document
        {
            ID = doc.ID,
            ParentID = doc.ParentID,
            Name = doc.SomeOtherVar
        }).ToList();
}

なんらかの理由で、parentID(現在はnullのparentIDを持つデータのみ)にnullを渡しても、結果が得られません。

このクエリをコピーしてLinqPadに貼り付け、次を実行します。

from doc in dbContext.Documents
where doc.ParentID == null
select doc

期待どおりの結果セットが返されます...

実際のクエリは結合と他の結合を残しましたが、私はそれらを削除してテストし、同じ結果を得たので、結合は何にも影響を与えません。アプリとLinqPadはどちらも同じDBに接続されています。

編集: applictionクエリで「null」だけでテストされ、期待どおりの結果が返されるため、問題はnullとint?を使用しています。同じ問題を抱えている他の人がこのスレッドを見つけるのに役立つように、質問を更新しました。

4

2 に答える 2

19

リテラルnull値は、nullになる可能性のあるパラメーターとは異なる方法で処理されます。に対して明示的にテストする場合null、生成されたSQLはIS NULL演算子を使用しますが、パラメーターを使用する場合は標準=演算子を使用します。つまり、SQLnullは何にも等しくないため、行は一致しません。これは、LINQtoSQLでのより厄介な.NET/SQLセマンティックの不一致の1つです。これを回避するには、次のような句を使用できます。

where doc.ParentID == parentID || (doc.ParentID == null && parentID == null)
于 2009-07-28T15:42:12.993 に答える
0

次のようなものも使用できます...

from doc in dbContext.Documents
where doc.IsParentIDNull()
select doc

それは私のために働いた!それがあなたのために働くことを願っています!

于 2009-11-27T13:54:21.077 に答える