当我在LINQ中使用sum函数时出现此错误:
转换为值类型'Decimal'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。
GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => Content.Amount==null?0:Content.Amount),
答案 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;