我正在使用Linq查询来获取客户及其可选的主要地址(客户可以拥有零个或多个地址).对象层次结构如下:
顾客
CustomerAddress(包含布尔属性Main)
地址
这是我正在使用的查询:
var qry = from customer cus in GetDBContext(c).customer join cusadd in GetDBContext(c).customeraddress on new { cus_code = cus.cus_code, main = "1" } equals new { cus_code = cusadd.cus_code, main = cusadd.Main_addr } into grpcusadd from cusadd in grpcusadd.DefaultIfEmpty() join add in GetDBContext(c).address on new { addr_code = cusadd.Addr_Code } equals new { addr_code = add.Addr_Code } into grpadd from add in grpadd.DefaultIfEmpty() select new { cus, cusadd, add }; var customers = qry.ToList();
当我在数据库上执行它(通过EF)时,它会正确返回值.当我在内存对象的模拟上下文中执行它时,我得到一个NullReferenceException:对象引用未设置为对象的实例.
我能够通过在第二个左连接中检查空值来修复此错误,因为第一个左连接返回空值:
join add in GetDBContext(c).address on new { addr_code = cusadd == null ? null : cusadd.Addr_Code } equals new { addr_code = add.Addr_Code } into grpadd
我找到了一个博文章,结论相同但没有解释:http://technologycraftsmen.net/blog/2010/04/14/multiple-outer-joins-in-linq-to-sql/
为什么此查询在本地对象上而不在数据库上失败?
应该级联左外连接总是在Linq中这样写吗?
感谢您的反馈意见!