2010-11-09 6 views
4

Je voudrais résumer une propriété sur une liste sous une liste ... Exemple:Comment ajouter une sous-liste dans linq?

je:

public class List1 { 
public List<List2> List2 { get; set; } 
} 

public class List2 { 
public int TotalUnits { get; set; } 
} 

À mon avis, j'ai un List<List1>, de sorte que je veux faire quelque chose comme :

<%= Model.List1.Where(x.List2.Any()).Sum(x=>x.TotalUnits) .%> 

il est évident que tout ce qui suit Somme ne fonctionne pas, mais est-il une manière que je peux le faire en une seule ligne sans avoir à créer une nouvelle Dto sur mon côté serveur?

+0

Votre premier '.Where' manque un argument ou quelque chose. Il n'y a pas de "x". – recursive

Répondre

10

Essayez-vous d'obtenir la somme de tous les TotalUnits dans chaque instance List2? Si oui, alors procédez comme suit

<%= Model.List1.SelectMany(x => x.List2).Sum(x => x.TotalUnits) %> 

Voici comment cela fonctionne

Model.List1.SelectMany(x => x.List2) 

Cela prend la List<List1> et la transforme en un IEnumerable<List2>. SelectMany est similaire à Select en ce qu'il s'agit d'une projection d'éléments dans une énumération, sauf qu'elle s'attend à un résultat dénombrable. La collection de résultats énumérables est alors placée dans un seul dénombrable. Ou en termes plus simples, il aplatit une liste de listes.

.Sum(x => x.TotalUnits) 

Cela résume tout le membre TotalUnits de List2.

Il y a aussi une petite faute de frappe dans votre code. Je crois qu'il devrait se lire comme suit (notez le mot-clé class manquant)

public int TotalUnits { get; set;} 
+0

+1 - bonne explication –

2

Si je vous comprends bien, vous cherchez quelque chose comme ceci:

Model.List1.Where(x => x.List2.Any()).Select(x => x.List2.Sum(y => y.TotalUnits)) 

Cela vous donnera une liste de les sommes des sous-listes contenant des éléments.

Questions connexes