首页 > 解决方案 > LINQ Sum() 中的 IsNull

问题描述

我在 LINQ 中遇到 IsNull 问题:

db.WarehouseInputsDetails
    .Select(p => new WarehouseInputDetailsViewModel
    {
        Id = p.Id
        RemainingQuantity = p.Quantity - p.LoadingsDetails.Sum(n => n.Quantity)
    }).AsQueryable();

p.LoadingsDetails.Sum(n => n.Quantity)可能性NULL。我想要这样的结果:

select Id, IsNull(Sum(Quantity),0) as Quantity from LoadingsDetails

我尝试过类似的东西:

db.WarehouseInputsDetails
    .Select(p => new WarehouseInputDetailsViewModel
    {
        Id = p.Id
        RemainingQuantity = p.LoadingDetails.First() == null ? p.Quantity : p.Quantity - p.LoadingsDetails.Sum(n => n.Quantity)
    }).AsQueryable();

它返回错误:

System.NotSupportedException:方法“First”只能用作最终查询操作。请考虑在此实例中使用“FirstOrDefault”方法。

我尝试过这样的事情:

db.WarehouseInputsDetails
    .Select(p => new WarehouseInputDetailsViewModel
    {
        Id = p.Id
        RemainingQuantity = (p.LoadingsDetails.Sum(n => n.Quantity) == DBNull.Value) ? p.Quantity : p.Quantity - p.LoadingsDetails.Sum(n => n.Quantity)
    }).AsQueryable();

或者

db.WarehouseInputsDetails
    .Select(p => new WarehouseInputDetailsViewModel
    {
        Id = p.Id
        RemainingQuantity = p.LoadingsDetails.First().Quantity == DBNull.Value ? p.Quantity : p.Quantity - p.LoadingsDetails.Sum(n => n.Quantity)
    }).AsQueryable();

返回错误:

运算符“==”不能应用于“十进制”和“DBNull”类型的操作数

在此处输入图像描述

标签: c#sql-serverentity-frameworklinq

解决方案


您可以Any()在此处使用它来检查是否有任何行 for ,如果是,则对forLoadingDetails求和:QuantityLoadingDetails

RemainingQuantity = p.LoadingDetails.Any()  ? 
                p.Quantity - p.LoadingsDetails.Sum(n => n.Quantity) : 
                p.Quantity 

推荐阅读