在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内部失控的坠机。Microsoft类从不故意抛出无意义的程序员错误异常,如NRE, ArrayIndexEx, DivByZeroEx,…
创建一个小的,可执行的副本,并在GitHub上报告错误。