J'ai une collection de produits
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Maintenant, je souhaite regrouper la collection en fonction du code produit et renvoyer un objet contenant le nom, le numéro ou les produits pour chaque code et le prix total de chaque produit.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
J'utilise donc un GroupBy pour grouper par ProductCode, puis je calcule la somme et je compte également le nombre d'enregistrements pour chaque code produit.
Voici ce que j'ai jusqu'à présent:
List<Product> Lines = LoadProducts();
List<ResultLine> result = Lines
.GroupBy(l => l.ProductCode)
.SelectMany(cl => cl.Select(
csLine => new ResultLine
{
ProductName =csLine.Name,
Quantity = cl.Count().ToString(),
Price = cl.Sum(c => c.Price).ToString(),
})).ToList<ResultLine>();
Pour une raison quelconque, la somme est effectuée correctement mais le compte est toujours 1.
Données Sampe:
List<CartLine> Lines = new List<CartLine>();
Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" });
Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" });
Lines.Add(new CartLine() { ProductCode = "p2", Price = 12M, Name = "Product2" });
Résultat avec des exemples de données:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Le produit 1 doit avoir count = 2!
J'ai essayé de simuler cela dans une application console simple mais là j'ai obtenu le résultat suivant:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Product1: ne doit être répertorié qu'une seule fois ... Le code ci-dessus peut être trouvé sur pastebin: http://pastebin.com/cNHTBSie
Price
sous forme décimale, puis modifier la façon dont vous le formatez. Gardez la représentation des données propre et ne passez à une vue de présentation qu'au dernier moment possible.La requête suivante fonctionne. Il utilise chaque groupe pour effectuer la sélection au lieu de
SelectMany
.SelectMany
travaille sur chaque élément de chaque collection. Par exemple, dans votre requête, vous avez un résultat de 2 collections.SelectMany
obtient tous les résultats, un total de 3, au lieu de chaque collection. Le code suivant fonctionne sur chaqueIGrouping
élément de la partie de sélection pour que vos opérations d'agrégation fonctionnent correctement.la source
Parfois, vous devez sélectionner certains champs par
FirstOrDefault()
ousingleOrDefault()
vous pouvez utiliser la requête ci-dessous:la source
FirstOrDefault() or
singleOrDefault () `?