【问题标题】:Linq to Entities NOT throwing Null reference exception for Left JoinLinq to Entities NOT 为 Left Join 抛出 Null 引用异常
【发布时间】: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


【解决方案1】:

这是因为 Linq 的延迟执行行为。实际上它是空的,但只有当您尝试转换为列表时它才会可见,那时只有查询才会执行。请尝试转换为如下列表,

var result =  query.Where(l => l.order.Product.Contains("Book")).ToList();

你会得到一个“NullReferenceException”

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多