サードパーティのADO.NETプロバイダーを使用してEF4からPostgreSQLを使用しています。私のデータソースには、この結合条件に基づくアイテムに一致するアイテム行がありません。このため、null参照例外に基づいてクエリ1が失敗することを期待しています。ただし、これで完了し、ilの各プロパティの値型のデフォルトが表示されます。item_display_nameは文字列であるため、ilNameはnullに設定されます。ilStartDateはDateTimeのデフォルトに設定されています。x.il.item_idとx.il.item_line_noはどちらも0です。
var query1 =
_db.items
.GroupJoin(_db.item_line.Where(x => x.start_date == selectedStartDate), x => x.item_id, il => il.item_id, (x, ilgroup) => new { x, ilgroup })
.SelectMany(x => x.ilgroup.DefaultIfEmpty(), (x, il) => new { x.x, il })
.Select(x =>
new
{
itemId = x.x.item_id,
ilName = x.il.item_display_name,
ilStartDate = x.il.start_date,
ilItemId = x.il.item_id,
orderLine = x.il.item_line_no});
ただし、Selectの前に結果に対してToArrayを呼び出して強制的に実行すると、null参照例外が発生します。
var query2 =
_db.items
.GroupJoin(_db.item_line.Where(x => x.start_date == selectedStartDate), x => x.item_id, il => il.item_id, (x, ilgroup) => new {x, ilgroup})
.SelectMany(x => x.ilgroup.DefaultIfEmpty(), (x, il) => new {x.x, il}).ToArray()
.Select(x =>
new
{
itemId = x.x.item_id,
ilName = x.il.item_display_name,
ilStartDate = x.il.start_date,
ilItemId = x.il.item_id,
orderLine = x.il.item_line_no});
私の理解では、DefaultIfEmptyはそのタイプのデフォルトを返す必要があります。私の型は明らかに参照型ですが、クエリ1が失敗しないのはなぜですか?