我正在使用 EF 4 到 PostgreSQL 使用 3rd 方 ADO.NET 提供程序。在我的数据源中,我没有与基于此连接条件的项目匹配的项目行。出于这个原因,我希望查询 1 基于空引用异常而失败。但是,它完成并为我提供了 il 上每个属性的值类型默认值。item_display_name 是一个字符串,因此 ilName 设置为空。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 来强制执行,则会得到空引用异常。
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 不会失败?