3

私は正常に動作する次のコードブロックを持っています。

var boughtItemsToday = (from DBControl.MoneySpent
            bought in BoughtItemDB.BoughtItems
            select bought);

BoughtItems = new ObservableCollection<DBControl.MoneySpent>(boughtItemsToday);

これは、ItemCategory、ItemAmount、ItemDateTime を含む MoneySpent テーブルからデータを返します。

これを ItemCategory と ItemAmount でグループ化するように変更して、どこで最も多くのお金を費やしているかを確認したいので、GroupBy クエリを作成し、これで終了しました。

var finalQuery = boughtItemsToday.AsQueryable().GroupBy(category => category.ItemCategory); 

BoughtItems = new ObservableCollection<DBControl.MoneySpent>(finalQuery);

これにより、2つのエラーが発生します。

エラー 1 'System.Collections.ObjectModel.ObservableCollection.ObservableCollection(System.Collections.Generic.List)' に最適なオーバーロードされたメソッドに無効な引数がいくつかあります

エラー 2 引数 1: 'System.Linq.IQueryable>' から 'System.Collections.Generic.List' に変換できません

そして、これが私が立ち往生しているところです!GroupBy および Sum 集計関数を使用して、1 つの LINQ クエリでカテゴリと関連する支出のリストを取得するにはどうすればよいですか?

感謝して受け取ったヘルプ/提案。

マーク

4

2 に答える 2

5

.GroupBy(category => category.ItemCategory);IGrouping オブジェクトの列挙型を返します。各 IGrouping のキーは個別の ItemCategory 値であり、値は MoneySpent オブジェクトのリストです。したがって、現在行っているように、これらのグループを ObservableCollection に単純にドロップすることはできません。

代わりに、グループ化された各結果を Select して、新しい MoneySpent オブジェクトにすることをお勧めします。

var finalQuery = boughtItemsToday
    .GroupBy(category => category.ItemCategory)
    .Select(grouping => new MoneySpent { ItemCategory = grouping.Key, ItemAmount = grouping.Sum(moneySpent => moneySpent.ItemAmount);

BoughtItems = new ObservableCollection<DBControl.MoneySpent>(finalQuery);
于 2012-04-06T17:29:52.963 に答える
0

必要なプロパティを使用して、各グループを無名クラス (または、このために新しいタイプを作成することをお勧めします) に射影できます。

var finalQuery = boughtItemsToday.GroupBy(category => category.ItemCategory);
                                 .Select(g => new 
                                  { 
                                     ItemCategory = g.Key, 
                                     Cost = g.Sum(x => x.ItemAmount)
                                  });

とにかく であるため、はAsQueryable()まったく必要ありません。クエリを組み合わせることもできます。boughtItemsTodayIQuerable

var finalQuery = BoughtItemDB.BoughtItems
                             .GroupBy(item => item.ItemCategory);
                             .Select(g => new 
                              { 
                                  ItemCategory = g.Key, 
                                  Cost = g.Sum(x => x.ItemAmount)
                              });
于 2012-04-06T17:25:12.600 に答える