2016-12-26 3 views
1

することにより、第1のグループを取得し、私がfollowinのようなLINQクエリがあります。LINQ複数のグループによると、値の数

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(); 

を、私はこのようにそれをすることによってグループ化することにより、総販売された商品の値を取得しようとしていた:

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 

所望の出力は次のようになります。

ItemID Sales ItemName 
1   15  Item1 
2   8  Item2 

私が書いたもの上記のクエリは私の総売上高の間違った値を示します言って:

TotalSoldItems = pr.Count(), 

にはどうすれば...カウント、または(これは私がによってグループ分けてるものです)固有のIDを持っている一つの項目のすべての売上を合計することができ、私は間違って

をしていますか? ?

答えて

0

GroubByを間違った方法で使用しています。毎回新しいユニークなオブジェクトを作成します。だからあなたの.GroupBy(x => new { x.ItemID, x.Title, x.GalleryURL }).Select(x => new { Key = new { x.ItemID, x.Title, x.GalleryURL}, Value =x })あなたはユニークなIDが必要ならば、IDによるグループのみ

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(); 

アドバイス

はあなたのLINQを最適化し、同じ

を意味します。コレクションを何度も繰り返しています。これは推奨されるコードです:

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(); 
関連する問題