2012-01-24 2 views
5

Je l'expression LINQ suivante:LINQ ne somme pas un groupe avec un flotteur? propriété

pantry = (from p in items 
      group p by p.IngredientId into g 
      select new PantryItem() { IngredientId = g.Key, Amt = g.Sum(p => p.Amt) }); 

En gros, j'essaie de supprimer les doublons d'un tableau en additionnant leurs montants totaux. Donc, si j'ai 2 articles de IngredientId x, un avec Amt 5 et l'autre avec Amt 10, je veux un seul élément de Ingrédient x avec le Amt 15. Assez facile non? Maintenant, pour tout casser complètement, Amt est en fait un float?, pas un float. Cependant, quand je Sum un groupe avec tous les montants null, je reçois 0.0 au lieu de null.

Voici ce que je veux:

x - null 
x - null 
y - 5 
y - 10 
z - 10 
z - null 

Si convertir:

x - null 
y - 15 
z - 10 

Mais au lieu-je obtenir:

x - 0.0 
y - 15 
z - 10 

est-il un moyen de re-travailler ma requête LINQ pour faciliter cela? Espérons que ma question est assez clair :)

+0

Bien est 'Amt' dans' PantryItem' de type Nullable? Je pense que ce n'est probablement pas – V4Vendetta

+0

'Amt' est un' float? ' –

Répondre

3

Vous avez 2 choix:

  1. Écrivez votre propre implémentation de Sum
  2. Vérifiez si toutes les valeurs sont null, puis revenez null, sinon retour somme, par exemple:

pantry = (from p in items 
      group p by p.IngredientId into g 
      select new PantryItem() 
      { 
       IngredientId = g.Key, 
       Amt = g.Any(p => p.Amt.HasValue) ? g.Sum(p => p.Amt) : null 
      }); 

NO TE: 2 nd requête énumérera deux fois.

+0

Y at-il un moyen de le faire dans une instruction LINQ, ou devrais-je construire un tableau des groupes NULL, puis construire un tableau des groupes non NULL, puis les joindre ensemble? –

+0

Oh cool (ignorer le commentaire, j'ai écrit cela avant de mettre à jour votre réponse) - Je vais essayer ça! –

+0

Fonctionne très bien, merci beaucoup! –