Подтвердить что ты не робот

Общий параметр ошибки Linq или запрос должны использовать тип с нулевым значением

Я получил эту ошибку, когда я использую функцию sum в LINQ:

Приведение значения к типу значения "Десятичный" завершилось неудачно, поскольку материализованное значение равно нулю. Либо общий параметр типа результата, либо запрос должен использовать тип с нулевым значением.

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

Ответ 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;