【发布时间】:2017-09-08 08:41:37
【问题描述】:
在 Linq to Object 中: 访问左外连接结果集的右表对象时,查询会抛出空引用异常。
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 )不会引发空引用异常。它只是返回记录。
为什么不抛出空引用异常?甚至
Order对象 对于Customer{Code:6, Name:"Dave"} 为空
编辑: 我尝试了以下变化。
var result = query.Where(l => l.order.Product.Contains("Book")).ToList();
上面的查询没有抛出空引用异常
var result = query.ToList().Where(l => l.order.Product.Contains("Book"));
这个查询抛出异常
对具有近 50,000 条记录的表的两个查询均未引发异常。
在我的生产环境中类似的查询,但数量级为 50,000 条记录,而不是 4 或 6 条记录。在数据访问层中,我在应用所有Where 过滤器后将查询结果返回为List。没有抛出异常,系统工作正常。
我是否需要在
Where谓词中检查Order对象的空值,如 Alex Zaitsev 的answer ?
【问题讨论】:
-
这个答案有帮助吗?
标签: c# entity-framework-6 linq-to-entities left-join