在EF查询语法

时间:2015-10-10 17:31:04

标签: c# sql entity-framework linq

我有一个查询,如果我使用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

获取

1 个答案:

答案 0 :(得分:2)

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

创建一个小的可执行repro并在GitHub上报告错误。团队响应迅速。