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;}
}
Je veux maintenant regrouper la collection en fonction du code produit et renvoyer un objet contenant le nom, le nombre de produits pour chaque code et le prix total pour 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 regrouper par ProductCode, puis je calcule la somme et compte également le nombre d'enregistrements pour chaque code produit.
C'est 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 faite correctement mais le compte est toujours 1.
Les données de 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 données échantillons :
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Le produit 1 devrait avoir le compte = 2 !
J'ai essayé de simuler cela dans une simple application console mais 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)
Produit1 : ne doit être listé qu'une seule fois... Le code de ce qui précède peut être trouvé sur pastebin : http://pastebin.com/cNHTBSie