在GroupBy和Sum聚合上使用带有ObservableCollection的LINQ

时间:2012-04-06 17:21:07

标签: c# linq group-by sum observablecollection

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

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&gt;'转换到'System.Collections.Generic.List'

这就是我被困住的地方!如何使用GroupBy和Sum聚合函数在1 LINQ查询中获取我的类别列表和相关支出?!

感激不尽的任何帮助/建议。

标记

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

您可以使用所需的属性将每个组投影到一个匿名的(或者更好的是为此创建一个新类型)类:

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