3

我有以下代码块可以正常工作;

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

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

它从我的 MoneySpent 表中返回数据,其中包括 ItemCategory、ItemAmount、ItemDateTime。

我想将其更改为按 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 中。

相反,您可能希望将每个分组结果选择到一个新的 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 回答