Linq error泛型参数或查询必须使用可为空的类型

Linq error泛型参数或查询必须使用可为空的类型,linq,null,Linq,Null,我在LINQ中使用sum函数时遇到了这个错误: 转换为值类型“Decimal”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型 你可以从源头上排除吗 var sum = GroupProduct.Where(a => a.Product.ProductID==1 && a.Amount != null) .Sum(a => (decimal)a.Amount); 这个看起来像是应该工作的(通常是这样),但当Wher

我在LINQ中使用sum函数时遇到了这个错误:

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


你可以从源头上排除吗

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

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

decimal sum1 = GroupProduct
    .Where(a => a.Product.ProductID == 1)
    .Sum(c => c.Amount ?? 0);
错误:
“转换为值类型‘Decimal’失败,因为具体化的值为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;

您是否尝试过以下方法:

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)));
试试这个:

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

这是我通常使用的。这将包括
金额
为空的可能性,也包括空集的可能性

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

Amount属性的数据类型是什么?如果Where不返回任何值,则必须使用DefaultIfEmpty,因此在这种情况下避免NULL。@malik-我不明白;你能重新表述一下你的评论吗?再次感谢你:有两件事。当我使用a.Product.ProductID时,对象为null,我可以在linq查询中检查它吗。我的意思是在lamda表达式中,我可以加载引用,并且可以在linq查询中处理null。@Sаааааааааӽ:感谢您在我的回答中纠正了错误。但是我把空合并操作符放回去了。仅当初始结果集为空时,DefaultIfEmpty才会返回单个0条目,如果它不是空的,但金额恰好为nullable且具有null值,则在没有null合并运算符的情况下,它将失败。如果第一位没有返回项目,则必须在求和之前为DefaultIfEmpty。如果第一位没有返回项目,则必须在求和之前为DefaultIfEmpty。是,这是另一种解决方法,允许在LINQ中使用可为null的类型,并在最后执行null合并。在我看来,DefaultIfEmpty是正确的解决方案,因为我们确实希望在最后得到一个数字,而不是一个可为空的结果。
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)