Как заставить linq Sum вернуть null, если суммарные значения равны нулю
У меня есть запрос LINQ, который выглядит так...
var duration = Level3Data.AsQueryable().Sum(d => d.DurationMonths);
Если все значения d.DurationMonths
равны null, Sum возвращает 0
. Как я могу вернуть Sum null
, если все d.DurationMonths
являются null
? Или мне нужно сначала запустить отдельный запрос, чтобы устранить эту ситуацию перед выполнением суммы?
Ответы
Ответ 1
Наряду с предыдущим предложением для метода расширения - вы можете использовать тернарный оператор...
var duration = Level3Data.AsQueryable().Any(d => d.DurationMonths.HasValue)
? Level3Data.AsQueryable().Sum(d => d.DurationMonths)
: null;
Ответ 2
Вы можете использовать Aggregate
для создания настраиваемого кода агрегации:
var items = Level3Data.AsQueryable();
var duration = items.Aggregate<D,int?>(null, (s, d) => (s == null) ? d.DurationMonths : s + (d.DurationMonths ?? 0));
(если элементы в Level3Data
имеют тип D
)
Ответ 3
var outputIndicatorSum = (from OutputIndicatorTable in objDataBaseContext.Output_Indicators
where OutputIndicatorTable.Output_Id == outputId
select (int?)OutputIndicatorTable.Status).Sum();
int outputIndicatorSumReturn = Convert.ToInt32(outputIndicatorSum);
return outputIndicatorSumReturn;
В явном виде можно вводить переменную, отличную от nullable, в тип NULL.
i.e, select (int?)OutputIndicatorTable.Status).Sum();
Ответ 4
Используя Sum, это невозможно. Как вы указали в своем вопросе, вам нужно будет проверить эту ситуацию до вызова суммы:
var q = Level3Data.AsQueryable();
var duration = q.All(d => d.DurationMonths == null)
? null
: q.Sum(d => d.DurationMonths);
Ответ 5
Если вы хотите получить результат без двух запросов, попробуйте:
var duration = Level3Data.AsQueryable(). Сумма (d = > (double?) d.DurationMonths);
Если вы хотите, чтобы нуль вместо нуля использовался в результате использования этого запроса:
var duration = Level3Data.AsQueryable(). Сумма (d = > (double?) d.DurationMonths)?? 0;