Как заставить 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;