Sélectionner plusieurs champs de groupe par et somme
Je veux faire une requête linq (liste d'objets) et je ne sais vraiment pas comment faire, je peux faire du groupe et de la somme, mais ne pouvez pas sélectionner reste des champs.
Exemple:
ID Value Name Category
1 5 Name1 Category1
1 7 Name1 Category1
2 1 Name2 Category2
3 6 Name3 Category3
3 2 Name3 Category3
Je veux group by ID, la SOMME de la Valeur et retourner tous les champs de ce genre.
ID Value Name Category
1 12 Name1 Category1
2 1 Name2 Category2
3 8 Name3 Category3
- Avez-vous vérifier ? code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b et dans ton cas: code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
- depuis tous les champs semble unique pour chaque ID, pourquoi ne pas les inclure dans le groupe.
- Oui je peux faire ça, mais j'ai plus de champs que ça... 🙁
- passez par ce lien.. stackoverflow.com/questions/847066/group-by-multiple-columns espérons que cela permettra de résoudre votre problème
Vous devez vous connecter pour publier un commentaire.
Mise à jour :
Si vous êtes en essayant d'éviter le regroupement de tous les champs, vous pouvez groupe par
Id
:Mais ce code suppose que pour chaque
Id
, le mêmeName
etCategory
appliquer. Si oui, vous devriez envisager de normalisation comme @Aron suggère. Elle impliquerait en gardantId
etValue
dans une classe et le déplacementName
,Category
(et selon d'autres domaines seraient les mêmes pour les mêmesId
) à une autre classe, tout en ayant également laId
de référence. Le processus de normalisation réduit la redondance des données et de la dépendance.essayez ceci:
de vérifier avec LINQPad:
Si votre classe n'est vraiment longue et que vous ne souhaitez pas copier tous les trucs, vous pouvez essayer quelque chose comme ceci:
À grand pouvoir, grande responsabilité est livré. Vous devez être prudent. Ligne
ret.value = x.Sum(xt => xt.value)
va changer votre collection originale, comme vous êtes de passage de référence, pas de nouvel objet. Si vous voulez éviter cela, vous devez ajouter quelquesClone
méthode dans votre classe commeMemberwiseClone
(mais encore une fois, cela permettra de créer de copie, donc attention). Afer qu'il suffit de remplacer la ligne avec:var ret = x.First().Clone();