2016-12-05 2 views
-2

この問題に直面し、解決策がオンラインで見つかりませんでした。だから私は自分の状況と同じような問題に直面しているかもしれない他の人たちのための私の所在を文書化したいと思う。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は匿名機能を実行しません。どのようにしてanull

答えて

0

私は誤って指示されていることに気付きました。 aは、デバッガが言っていたものの、nullではありませんでした。 cnullであった。

from a in db.Attributes.Where(a => c != null ? a.ItemId == c.ChildItemId : false).DefaultIfEmpty() 

私は、これは将来的に他の人が原因のエラーメッセージのミスディレクションに混乱のh>1時間を回避するのに役立ちます願っています:それは簡単な問題であり、簡単な修正です。デバッガまたはエラーメッセージは、常に信頼できるとは限りません。

関連する問題