Общий параметр ошибки Linq или запрос должны использовать тип с нулевым значением
Я получил эту ошибку, когда я использую функцию sum в LINQ:
Приведение значения к типу значения "Десятичный" завершилось неудачно, поскольку материализованное значение равно нулю. Либо общий параметр типа результата, либо запрос должен использовать тип с нулевым значением.
GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => Content.Amount==null?0:Content.Amount),
Ответы
Ответ 1
Это то, что я обычно использую. Это будет охватывать возможность 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
.
Ответ 2
Вы попробовали следующее:
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)));
Ответ 3
Вы можете исключить из источника?
var sum = GroupProduct.Where(a => a.Product.ProductID==1 && a.Amount != null)
.Sum(a => (decimal)a.Amount);
Ответ 4
Попробуйте следующее:
var sum = GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => (int?) Content.Amount);
sum = sum ?? 0;
Ответ 5
Этот выглядит как он должен работать (и обычно это делает), но терпит неудачу, когда метод 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;