Как заставить linq Sum возвращать ноль, если все значения суммируются - PullRequest
14 голосов
/ 24 августа 2009

У меня есть запрос LINQ, который выглядит следующим образом ...

var duration = Level3Data.AsQueryable().Sum(d => d.DurationMonths);

Если все значения d.DurationMonths равны нулю, сумма возвращает 0. Как я могу вернуть сумму null, если все d.DurationMonths равны null? Или мне нужно сначала выполнить отдельный запрос, чтобы устранить эту ситуацию перед выполнением суммы?

Ответы [ 5 ]

11 голосов
/ 24 августа 2009

Наряду с предыдущим предложением для метода расширения - вы можете использовать троичный оператор ...

var duration = Level3Data.AsQueryable().Any(d => d.DurationMonths.HasValue) 
               ? Level3Data.AsQueryable().Sum(d => d.DurationMonths) 
               : null;
5 голосов
/ 24 августа 2009

Вы можете использовать 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 голосов
/ 08 мая 2013
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;

Вы можете явно набрать приведение ненулевого varaible в обнуляемый тип. i.e, select (int?)OutputIndicatorTable.Status).Sum();

1 голос
/ 24 августа 2009

Используя только Sum, это невозможно. Как вы указали в своем вопросе, вам нужно будет проверить эту ситуацию, прежде чем звонить Sum:

var q = Level3Data.AsQueryable();
var duration = q.All(d => d.DurationMonths == null)
                   ? null
                   : q.Sum(d => d.DurationMonths);
0 голосов
/ 28 марта 2013

Если вы хотите получить результат без двух запросов, попробуйте:

var duration = Level3Data.AsQueryable (). Sum (d => (double?) D.DurationMonths);

Если вы хотите получить ноль вместо нуля в результате этого запроса, используйте:

var duration = Level3Data.AsQueryable (). Сумма (d => (double?) D.DurationMonths) ?? 0;

...