2016-12-26 4 views
1

ich eine Linq-Abfrage wie followin haben:LINQ mehrere Gruppe und dann die erste Gruppe von Zählwertes immer

var _transactionsList = TransactionsData 
       .GroupBy(x => new { x.ItemID, x.Title, x.GalleryURL }) 
       .Select(pr => new TransactionsTabResults 
       { 
        ItemID = pr.Key.ItemID, 
        Title = pr.Key.Title, 
        GalleryURL = pr.Key.GalleryURL, 

        ItemPrice = pr.OrderByDescending(a => a.TransactionDate).First().ItemPrice, 

        TotalSoldItems = pr.Count(), 
        TotalRevenuePerItem = pr.Sum(y => y.ItemPrice), 
        AveragePrice = pr.Average(y => y.ItemPrice), 
       }).ToList(); 

Ich versuche, die insgesamt verkauften Artikel Wert zu holen, indem sie durch wie diese Gruppierung:

ItemID Sales ItemName 

1   1   Item1 
1   3   Item1 
1   5   Item1 
1   6   Item1 
2   2   Item2 
2   2   Item2 
2   2   Item2 
2   2   Item2 

würde die gewünschte Ausgabe sein:

ItemID Sales ItemName 
1   15  Item1 
2   8  Item2 

Die Abfrage oben, dass ich gibt mir für einen Gesamtumsatz falsche Werte geschrieben mit den Worten:

TotalSoldItems = pr.Count(), 

Wie kann ich zählen, oder alle Verkäufe von einem Artikel zusammenzufassen, die eindeutige ID hat (das ist, was ich durch die Gruppierung) ...

Was mache ich falsch? ?

Antwort

0

Sie verwenden Groomby falsch. Sie erstellen jedes Mal ein neues eindeutiges Objekt. So Ihre .GroupBy(x => new { x.ItemID, x.Title, x.GalleryURL }) und .Select(x => new { Key = new { x.ItemID, x.Title, x.GalleryURL}, Value =x }) bedeutet das gleiche

Wenn Sie eindeutige Id brauchen Gruppe dann durch Id nur

TransactionsData 
.GroupBy(x => x.ItemID) 
.Select(pr => new TransactionsTabResults 
{ 
    ItemID = pr.Key, 
    Title = pr.First().Title, 
    GalleryURL = pr.First().GalleryURL, 
    ItemPrice = pr.OrderByDescending(a => a.TransactionDate).First().ItemPrice, 
    TotalSoldItems = pr.Count(), 
    TotalRevenuePerItem = pr.Sum(y => y.ItemPrice), 
    AveragePrice = pr.Average(y => y.ItemPrice), 
}).ToList(); 

Tipps

Ihre LINQ optimieren. Sie durchlaufen viele Sammlungen mehrmals. Dies ist ein vorgeschlagener Code:

TransactionsData 
.GroupBy(x => x.ItemID) 
.Select(pr => 
{ 
    var items = x.pr.ToArray; 
    var sum = items.Sum(y => y.ItemPrice); 
    return new TransactionsTabResults 
    { 
     ItemID = pr.Key, 
     Title = items[0].Title, 
     GalleryURL = items[0].GalleryURL, 
     ItemPrice = pr.Aggregate((max, cur)=>max.TransactionDate<cur.TransactionDate?cur:max).ItemPrice, 
     TotalSoldItems = items.Length, 
     TotalRevenuePerItem = sum, 
     AveragePrice = sum/items.Length, 
    }; 
}).ToList();