Ich habe eine Sammlung von Produkten
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Jetzt möchte ich die Sammlung basierend auf dem Produktcode gruppieren und ein Objekt zurückgeben, das den Namen, die Nummer oder die Produkte für jeden Code und den Gesamtpreis für jedes Produkt enthält.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
Also benutze ich ein GroupBy, um nach ProductCode zu gruppieren, dann berechne ich die Summe und zähle auch die Anzahl der Datensätze für jeden Produktcode.
Das habe ich bisher:
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>();
Aus irgendeinem Grund wird die Summe korrekt gemacht, aber die Zählung ist immer 1.
Sampe Daten:
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" });
Ergebnis mit Beispieldaten:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Produkt 1 sollte count = 2 haben!
Ich habe versucht, dies in einer einfachen Konsolenanwendung zu simulieren, aber dort habe ich das folgende Ergebnis erhalten:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Produkt1: sollte nur einmal aufgeführt werden ... Der Code für die oben genannten Informationen finden Sie auf pastebin: http://pastebin.com/cNHTBSie
Price
auch eine Dezimalzahl beibehalten und dann die Formatierung ändern. Halten Sie die Datendarstellung sauber und wechseln Sie erst im letztmöglichen Moment zu einer Präsentationsansicht.Die folgende Abfrage funktioniert. Es verwendet jede Gruppe, um die Auswahl anstelle von durchzuführen
SelectMany
.SelectMany
arbeitet an jedem Element aus jeder Sammlung. In Ihrer Abfrage haben Sie beispielsweise ein Ergebnis von 2 Sammlungen.SelectMany
Erhält alle Ergebnisse, insgesamt 3, anstelle jeder Sammlung. Der folgende Code funktioniert jeweilsIGrouping
im ausgewählten Bereich, damit Ihre Aggregatvorgänge ordnungsgemäß funktionieren.quelle
Manchmal müssen Sie einige Felder auswählen,
FirstOrDefault()
odersingleOrDefault()
Sie können die folgende Abfrage verwenden:quelle
FirstOrDefault() or
Kannst du bitte erklären, warum ich manchmal singleOrDefault () `verwenden muss?