この問題に直面し、解決策がオンラインで見つかりませんでした。だから私は自分の状況と同じような問題に直面しているかもしれない他の人たちのための私の所在を文書化したいと思う。LINQ匿名関数のパラメータ参照がオブジェクトのインスタンスに設定されていない
これは、他のすべてのLINQおよびNull参照の質問と重複していません。私はこれを研究している間にそれらを読んで、私の状況はLINQの無知でもなく、OOPの無知でもありませんでした。 2つの異なる環境が私に間違ったデータポイントを指し示していたという事実がありました。
これは、SQL Serverデータベースをヒットするかなり複雑なLINQクエリの私の蒸留です。
var query = from i in db.Items
join s in db.Stores on i.Id equals s.ItemId
from c in db.Sets.Where(t => t.ChildItemId == i.Id && t.StoreId = s.Id).DefaultIfEmpty()
from a in db.Attributes.Where(a => a.ItemId == c.ChildItemId).DefaultIfEmpty()
where i.IsActive && s.IsActiveAtStore
select new
{
Id = c != null ? c.ParentItemId : i.Id,
}
...
N.b.左の結合。
(実際の)LINQがコンパイルされます。また、データベースを正しく照会して正常に照会します。
私の仕事は、このクエリをオブジェクトデータでテストすることでした。私はユニットテストを実行したとき、彼らは属性句で失敗まま:
from a in db.Attributes.Where(a => a.ItemId == c.ChildItemId).DefaltIfEmpty()
Visual StudioはReference not set to an instance of an object
を訴えました。このクエリは実際にはかなり大きく、もちろんデバッグは不可能です。だから私はLinqPadでそれを嘲笑し、それは同じことを言った。それは、a
が問題だったということでした。つまり、エラーを示す波線は、最初にa
の下にあり、(a => a.ItemId...)
に入っています。しかし、a
は決してnull
になることはありません。 null
の場合、db.Attributes
には何も表示されず、Where
は匿名機能を実行しません。どのようにしてa
null
?