我有以下代码块,工作正常;
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查询中的相关支出?!
任何帮助/建议感激不尽。
标记
.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);
您可以使用所需的属性将每个组投影到任意名称(或者更好的是为此创建新类型)类:
var finalQuery = boughtItemsToday.GroupBy(category => category.ItemCategory);
.Select(g => new
{
ItemCategory = g.Key,
Cost = g.Sum(x => x.ItemAmount)
});
因为AsQueryable()
无论如何都是boughtItemsToday
,所以根本不需要IQuerable
。您也可以只组合查询:
var finalQuery = BoughtItemDB.BoughtItems
.GroupBy(item => item.ItemCategory);
.Select(g => new
{
ItemCategory = g.Key,
Cost = g.Sum(x => x.ItemAmount)
});