在EF查询语法中使用let时出现NullReferenceException

本文关键字:let NullReferenceException EF 查询 语法 | 更新日期: 2023-09-27 18:17:16

我有一个查询,如果我使用let,我得到一个NullReferenceException,但是如果我在选择中使用相同的语句,它工作得很好。

var q = db.WorkOrders;

下面的查询抛出异常:

(from wo in q.OrderByDescending(x => x.WorkOrderNumber)
let cost = wo.Costs.Select(x => x.BaseCost + x.AdminOverhead + x.LabourOverhead).DefaultIfEmpty(0).Sum()
select new ManageWorkOrderData
{
    Id = wo.Id,
    TotalCost = cost
}).ToListAsync();

(from wo in q
select new ManageWorkOrderData
{
    Id = wo.Id,
    TotalCost = wo.Costs.Select(x => x.BaseCost + x.AdminOverhead + x.LabourOverhead).DefaultIfEmpty(0).Sum()
}).ToListAsync();

请注意,在第二个子查询中是相同的,只是不是let

这个问题已被标记为重复,但我不同意,因为在linq查询的let部分不使用时,代码工作正常。没有一个类型是可空的,它的实体框架解释代码,所以我不能检查空。

在VS中没有办法调试代码,因为代码都是由实体框架/SQL执行的。有趣的是,这个查询不是在服务器上执行的,这让我相信这是EF的问题。我很有兴趣看看是否有人有任何见解,为什么EF抛出一个异常与let,而不是在选择时使用。

public class WorkOrder
{
    public int Id { get; set; } 
    public int WorkOrderNumber { get; set; } 
    public virtual ICollection<Cost> Costs { get; set; }
    public WorkOrder()
    {
        Costs = new HashSet<Cost>();
    }
}
public class Cost
{
    public int Id { get; set; }
    public int WorkOrderId { get; set; }
    public decimal BaseCost { get; set; }
    public decimal AdminOverhead { get; set; }
    public decimal LabourOverhead { get; set; }
    public virtual WorkOrder WorkOrder { get; set; }
}
public class ManageWorkOrderData
{
    public int Id { get; set; }
    public decimal TotalCost { get; set; }
}

堆栈跟踪可从http://pastebin.com/uXkdM30A

在EF查询语法中使用let时出现NullReferenceException

获取

这是一个实体框架错误。这可以从堆栈跟踪中看到。这是EF内部失控的坠机。Microsoft类从不故意抛出无意义的程序员错误异常,如NRE, ArrayIndexEx, DivByZeroEx,…

创建一个小的,可执行的副本,并在GitHub上报告错误。