2010-11-18 31 views
1

J'ai une déclaration LINQ qui travaille grande ... sa part select ici il estSi une valeur Sum() renvoie Null, utilisez 0 pour le convertir en double nullable?

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) 
}; 

Maintenant, si vous remarquez que je utilise System.Double? (annulable double) dans un plâtre à la mendicité en raison du fait que certaines valeurs sont renvoyées comme NULL sur la somme.

Si je change à System.Double il échoue avec l'erreur

La valeur nulle ne peut pas être affectée à un élément de type System.Double qui est une valeur non nulle de type

Donc, ce que je voudrais faire est de retourner la valeur de la somme, mais si elle est NULL, entrez un 0 là-dedans.

Toute aide vraiment apprécié

Répondre

5

Utilisez le null coalescing operator:

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

Dans votre cas:

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

peut provoquer l'exception 'g.Sum (p => p.Amount) ?? 0) .First() 'utilise à la place' g.Sum (p => p.Amount) ?? 0) .FirstOrDefault() ' –

+0

@Seed, oui, mais je ne voulais pas changer la signification du code OP –

1

ajouter simplement ?? 0

changement .First().Expr1) à .First().Expr1) ?? 0

0

Ou vous pouvez filtrer votre collection g en conséquence ...

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); 
0

Au lieu de Sum vous pouvez utiliser la méthode Aggregate avec une graine de 0.0. Cela ne nécessite pas l'utilisation de types nullables, ou le casting explicite.

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) 
};