Ho una collezione di prodottiLinq: GroupBy, Somma e Conte
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Ora voglio gruppo la collezione in base al codice del prodotto e restituire un oggetto che contiene il nome, il numero o prodotti per ciascun codice e il prezzo totale per ogni prodotto.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
Così ho utilizzare un GroupBy al gruppo da CodiceProdotto, poi a calcolare la somma e anche contare il numero di record per ciascun codice di prodotto.
Questo è quello che ho finora:
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>();
Per qualche ragione, la somma viene eseguita correttamente, ma il conteggio è sempre 1. dati
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" });
Risultato con dati di esempio:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Prodotto 1 dovrebbe avere count = 2!
Ho cercato di simulare questo in una semplice applicazione console, ma non ho ottenuto il seguente risultato:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Product1: dovrebbe essere elencato solo una volta ... Il codice per quanto sopra può essere trovato su pastebin : http://pastebin.com/cNHTBSie
Ok, la mia app della console funziona. Grazie per avermi contattato per utilizzare First() e lasciare SelectMany. Il ResultLine è in realtà un ViewModel.Il prezzo verrà formattato con il simbolo di valuta. Ecco perché ho bisogno che sia una stringa. Ma potrei cambiare la quantità in int .. Vedrò ora se questo può anche aiutare per il mio sito web. Ti farò sapere. – ThdK
@ThdK: No, si dovrebbe mantenere anche "Prezzo" come decimale, e quindi modificare il modo in cui lo si formatta. Mantieni la rappresentazione dei dati pulita e passa alla visualizzazione della presentazione solo all'ultimo momento. –
Perché non raggruppare in base al codice prodotto e al nome? Qualcosa del genere: .GroupBy (l => new {l.ProductCode, l.Name}) e usa ProductName = c.Key.Name, –