オブジェクトに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をチェックする必要がありますか?
を取得します、以下のようなリストに変換してみてください? –