Mam kolekcję produktówLINQ: GroupBy, Sum i liczyć
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Teraz chcę grupy kolekcję na podstawie kodu produktu i powrócić obiekt zawierający nazwę, numer lub produktów, dla każdego kodu i łączna cena dla każdego produktu.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
Więc używam GroupBy do grupy, kodu produktu, a następnie obliczyć sumę, a także policzyć liczbę rekordów dla każdego kodu produktu.
To, co mam tak daleko:
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>();
Z jakiegoś powodu suma jest zrobione poprawnie, ale liczba jest zawsze 1.
sampe dane:
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" });
Wynik z przykładowymi danymi:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Produkt 1 powinien mieć wartość = 2!
próbowałem symulować to w prostej aplikacji konsoli, ale nie mam następujący wynik:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Produkt1: powinny być wymienione tylko raz ... Kod na powyższe można znaleźć na pastebin : http://pastebin.com/cNHTBSie
Ok moja aplikacja konsolowa działa. Dzięki za wskazanie mnie do użycia First() i pomiń SelectMany. ResultLine jest w rzeczywistości ViewModel.Cena zostanie sformatowana za pomocą znaku waluty. Właśnie dlatego potrzebuję tego jako struny. Ale mogę zmienić ilość na int .. Zobaczę teraz, czy to może również pomóc w mojej witrynie. Dam ci znać. – ThdK
@ThdK: Nie, powinieneś zachować 'Cena' również w postaci dziesiętnej, a następnie zmienić sposób formatowania. Utrzymuj czystość reprezentacji danych i zmieniaj ją w widoku prezentacji w ostatnim możliwym momencie. –
Dlaczego nie grupować według kodu produktu i nazwy? Coś w tym stylu: .GroupBy (l => new {l.ProductCode, l.Name}) i użyj ProductName = c.Key.Name, –