我有一个查询,如果我使用let
我得到NullReferenceException
但是如果我在select中使用相同的语句它可以正常工作。
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
部分中未使用时工作正常。所有类型都不可为空,并且它的实体框架解释代码,因此我无法检查空值。
由于代码全部由Entity Framework / SQL执行,因此无法在VS中调试代码。有趣的是,查询未在服务器上执行,这让我相信它的EF问题。我有兴趣看看其他人是否有任何关于EF为什么会抛出let
的异常而不是在select中使用异常的见解。
类
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
获取答案 0 :(得分:2)
这是一个实体框架错误。这可以从堆栈跟踪中看出。这是EF内部无法控制的崩溃。 Microsoft类从不故意抛出无意义的程序员错误异常,如NRE,ArrayIndexEx,DivByZeroEx,......
创建一个小的可执行repro并在GitHub上报告错误。团队响应迅速。