У меня есть большой запрос Entity Framework, содержащий эти строки.
var programs = from p in Repository.Query<Program>()
where p.OfficeId == CurrentOffice.Id
let totalCharges = p.ProgramBillings.Where(b => b.Amount > 0 && b.DeletedDate == null).Select(b => b.Amount).Sum()
let totalCredits = p.ProgramBillings.Where(b => b.Amount < 0 && b.DeletedDate == null).Select(b => -b.Amount).Sum()
let billingBalance = (totalCharges - totalCredits)
Когда я материализую данные, я получаю следующую ошибку:
Приведение значения к типу значения "Десятичный" завершилось неудачно, поскольку материализованное значение равно нулю. Либо общий параметр типа результата, либо запрос должен использовать тип с нулевым значением.
Если я изменил свой запрос следующим образом (добавленный в двух типах), ошибка исчезнет.
var programs = from p in Repository.Query<Program>()
where p.OfficeId == CurrentOffice.Id
let totalCharges = (decimal?)p.ProgramBillings.Where(b => b.Amount > 0 && b.DeletedDate == null).Select(b => b.Amount).Sum()
let totalCredits = (decimal?)p.ProgramBillings.Where(b => b.Amount < 0 && b.DeletedDate == null).Select(b => -b.Amount).Sum()
let billingBalance = (totalCharges - totalCredits)
Я не понимаю этого. ProgramBilling.Amount
является непустым значением десятичного числа. Если я нахожусь над вызовом Sum()
, Intellisense говорит, что возвращает тип Decimal. И все же дополнительные тесты подтвердили, что в моей второй версии totalCharges
и totalCredits
оба установлены равными нулю для тех строк, где ProgramBillings
не имеет данных.
Вопросы:
-
Я понял, что
Sum()
возвращает 0 для пустой коллекции. При каких обстоятельствах это не так? -
И если иногда это не так, то почему, когда я наводил курсор на
Sum()
, Intellisense показывает, что он возвращает тип Decimal, а не Decimal? Похоже, у Intellisense было такое же понимание, что и у меня.
EDIT:
Казалось бы, легко сделать что-то вроде Sum() ?? 0m
. Но это незаконно, давая мне ошибку:
Оператор '??' не может применяться к операндам типа "десятичный" и "десятичный"