Если значение Sum () возвращает Null, используйте 0, в настоящее время оно имеет приведение к двойному значению? - PullRequest
1 голос
/ 18 ноября 2010

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

 select new
 {
     Net = (System.Double?)
     ((from m0 in MOVTOS
     where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
     group m0 by new { 0.ClientCode } into g
     select new
     {
         Expr1 = (System.Double)g.Sum(p => p.Amount)
     }).First().Expr1)
};

Теперь, если вы заметили, что я использую System.Double? (обнуляемый двойной) в качестве приведения напопрошайничество из-за того, что некоторые значения возвращаются как NULL в сумме.

Если я изменяю его на System.Double, он завершается ошибкой

Нулевое значение не может быть присвоеночлен с типом System.Double, который является ненулевым значением типа

Так что я хотел бы сделать, это вернуть значение SUM, но если оно равно NULL, введите 0 там.

Любая помощь действительно ценится

Ответы [ 4 ]

5 голосов
/ 18 ноября 2010

Используйте оператор объединения нулей :

double? nullable = null;
double notNullable = nullable ?? 0;

В вашем случае:

select new
{
    Net =
        (from m0 in MOVTOS
         where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
         group m0 by new { 0.ClientCode } into g
         select g.Sum(p => p.Amount) ?? 0).First()
};
1 голос
/ 18 ноября 2010

Просто добавьте ?? 0

Изменить .First().Expr1) на .First().Expr1) ?? 0

0 голосов
/ 17 января 2013

Вместо Sum вы можете использовать метод Aggregate с начальным числом 0.0.Это не требует использования обнуляемых типов или явного приведения.

select new
{
    Net =
    ((from m0 in MOVTOS
    where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
    group m0 by new { 0.ClientCode } into g
    select new
    {
        Expr1 = g.Aggregate(0.0, (a, p) => a + p.Amount)
    }).First().Expr1)
};
0 голосов
/ 18 ноября 2010

Или вы можете отфильтровать свою коллекцию g соответственно ...

List<double?> dArr = new List<double?>( )
{
   1,
   3,
   null,
   5
};

double sum = dArr.Select( item =>
   {
       if( item.HasValue == false )
          return 0;
       else
          return item;
   } ).Sum( item => item.Value );
...