2017-09-08 11 views
0

オブジェクトにLinq: 左外部結合結果セットの右テーブルオブジェクトにアクセスしている間、クエリはNull参照例外をスローします。Linq to Entities Left JoinのNull参照例外をスローしません

var customers = new Customer[] 
    { 
     new Customer{Code = 5, Name = "Sam"}, 
     new Customer{Code = 6, Name = "Dave"}, 
     new Customer{Code = 7, Name = "Julia"}, 
     new Customer{Code = 8, Name = "Sue"} 
    }; 


    var orders = new Order[] 
    { 
     new Order{KeyCode = 5, Product = "Book"}, 
     //new Order{KeyCode = 6, Product = "Game"}, 
     new Order{KeyCode = 7, Product = "Computer"}, 
     new Order{KeyCode = 7, Product = "Mouse"}, 
     new Order{KeyCode = 8, Product = "Shirt"}, 
     new Order{KeyCode = 5, Product = "Underwear"} 
    }; 

    var query = customers.GroupJoin(orders, 
     c => c.Code, 
     o => o.KeyCode, 
     (customer, order) => new { customer,order}) 
     .SelectMany(q => q.order.DefaultIfEmpty(),(q,order)=>new{q.customer,order}); 

    query.Where(l => l.order.Product.Contains("Book")).Dump(); 

お客様を想定し、受注データは、SQLServerののように、上記の。同じクエリ(つまり、LINQ to EF)がnull参照例外をスローしていません。レコードを返すだけです。

null参照例外をスローしていないのはなぜですか? Customerに対してもOrderオブジェクト {コード:6、名称: "デイブ" は}次のように私は少し変化に試み 編集

ヌルです。問い合わせの上

var result = query.Where(l => l.order.Product.Contains("Book")).ToList(); 

このクエリは、ほぼ50,000レコードが例外をスローしませ持つテーブルの上に両方のクエリ例外

を投げ

var result = query.ToList().Where(l => l.order.Product.Contains("Book")); 

null参照例外を投げません。

私の生産環境では同様のクエリですが、4または6個のレコードではなく50,000個のレコードの大きさです。データアクセスレイヤーでは、Whereフィルタをすべて適用した後、クエリ結果をListとして返します。例外はスローされず、システムは正常に動作しています。

私は アレックス・ザイツェフのanswerのようにWhere述語でOrderオブジェクトにはnullをチェックする必要がありますか?

+0

を取得します、以下のようなリストに変換してみてください? –

答えて

1

これは、Linqの遅延実行動作のためです。実際にはnullですが、リストに変換しようとしているときにのみ表示され、その時間のみのクエリが実行されます。

var result = query.Where(l => l.order.Product.Contains("Book")).ToList(); 

あなたは「とNullReferenceException」答えは助けない

関連する問題