Linq2SQL: всегда получайте .Sum (), чтобы вернуть 0 вместо нуля - PullRequest
4 голосов
/ 10 февраля 2009

Есть ли способ (через механизм расширения?), Чтобы функция Sum() всегда возвращала 0.

Мой обходной путь - написать так, но я надеюсь, что есть лучшее решение?

((int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0),

Ответы [ 4 ]

6 голосов
/ 10 февраля 2009

Ваш обходной путь есть хороший. Почему бы вам не написать метод расширения для IEnumerable, похожий на Sum, который называется что-то вроде SumOrDefault. Тогда вы можете просто повторно использовать метод расширения, и вам не нужно будет искать обходной путь.

Ваш метод расширения будет очень простым и просто используйте точный код из вашего решения.

2 голосов
/ 10 февраля 2009

Это довольно хороший способ на самом деле. Я думаю, что лучший вопрос - почему это пустое начало? Если сущность, для которой вы вызываете сумму, не равна нулю, запрос должен всегда возвращать 0. Возможно, будет лучшим решением проверить, является ли ваша сущность действительной в начале, а не заставлять сумму всегда возвращать 0 - нулевое значение есть проблема.

1 голос
/ 01 декабря 2009

Напишите метод расширения:

public static Decimal? CorrectSum<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
{
    Decimal? sum = null;
    foreach (TSource s in source)
    {
        Decimal? val = selector(s);

        if (val.HasValue == true)
        {
            sum = (sum ?? 0) + val;
        }
    }

    return sum;
}
1 голос
/ 10 февраля 2009

Вопрос о том, должно ли оно быть 0 или ноль, является непростым. Это зависит от того, что вы понимаете под «суммой». Если это «сумма всех (выбранных) записей», то значение null будет уместным, если какая-либо из записей содержит NULL, поскольку технически вы не знаете наверняка. Если это означает «сумму всех известных (выбранных) записей», оно должно вернуть 0.

Какой из них подходит в вашей ситуации, решать только вы, поэтому я думаю, что то, что вы сделали здесь, вовсе не является плохим решением.

Для получения дополнительной информации о тернистости NULL прочитайте некоторые работы Криса Дейта и Хью Дарвена на эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...