Linq错误通用参数或查询必须使用可空类型

时间:2010-01-16 09:21:28

标签: linq null

当我在LINQ中使用sum函数时出现此错误:

  

转换为值类型'Decimal'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。

GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => Content.Amount==null?0:Content.Amount),

5 个答案:

答案 0 :(得分:14)

这是我通常使用的。这将涵盖Amount为空的可能性,并且还包括空集的可能性。

GroupProduct.Where(a => a.Product.ProductID == 1)
    .Select(c => c.Amount ?? 0) // select only the amount field
    .DefaultIfEmpty()  // if selection result is empty, return the default value
    .Sum(c => c)

DefaultIfEmpty()会返回与Amount类型相关联的默认值,即int,在这种情况下,默认值为0

答案 1 :(得分:10)

您是否尝试过以下操作:

GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => (decimal?)Content.Amount)

我的应用程序中的代码如下:

var data = query.AsEnumerable().Select(row => TaskInfo.FetchTaskInfo(row,
      ctx.ObjectContext.Hours.Where(hour => hour.TaskId == row.TaskId).Sum(hour => (decimal?)hour.Duration),
      ctx.ObjectContext.Notes.Count(note => note.SourceType == (int)SourceType.Task && note.SourceId == row.TaskId)));

答案 2 :(得分:4)

你可以在源头排除吗?

var sum = GroupProduct.Where(a => a.Product.ProductID==1 && a.Amount != null)
            .Sum(a => (decimal)a.Amount);

答案 3 :(得分:4)

试试这个:

var sum = GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => (int?) Content.Amount);
sum = sum ?? 0;

答案 4 :(得分:1)

这个看起来就像它应该工作(通常那样)但是当Where()方法返回null时失败:

decimal sum1 = GroupProduct
    .Where(a => a.Product.ProductID == 1)
    .Sum(c => c.Amount ?? 0);

错误:"The cast to value type 'Decimal' failed because the materialized value is null"是由于Sum()方法在对空集求和时返回null(非零)。

这些都适用于我:

decimal? sum2 = GroupProduct
    .Where(a => a.Product.ProductID == 1)
    .Sum(c => c.Amount);

decimal sum3 = GroupProduct
    .Where(a => a.Product.ProductID == 1)
    .Sum(c => c.Amount) ?? 0;