C# 分组查询
分组查询(group query)把数据分解为组,允许按组来排序、计算聚合值以及进行比较。这常常是商务环境中最有趣的查询(它驱动了决策系统)。例如,要按照国家或区域比较销售量,确定在哪里开新店或雇用更多员工,如下例所示。
试一试 分组查询:BeginningCSharp7—22_10_J3roupQuery\Program.cs
按照下面的步骤在Visual Studio 2017中创建示例:
(1)在 C:\BeginningCSharp7\Chapter22自录中创建一个新的控M台应用程序 BeginnitigCSliarp7_22_lO_GroupQuery。
(2)如 BeginningCSharp7_22_8_SelectDistinctQuery 示例所示,创建 Customer 类并初始化 customers 列表(List<Customer> customers),这些代码与前面示例中的代码完全相同。
(3)在Main()方法的customers列表初始化后,输入如下所示的两个査询:
var queryResults =
from c in customers
group c by c.Region into cg
select new { TotalSales = cg.Sum(c => c.Sales), Region = eg.Key }
;
var orderedResults =
from eg in queryResults
orderby eg.TotalSales descending
select eg
;
(4)在MainO方法中,添加下面的输出语句和foreach处理循环:
WriteLine(MTotal\t: By\nSales\t: RegionNn-----\t ------");
foreach (var item in orderedResults)
{
WriteLine($"{item.TotalSales}\t: {item.Region}");
}
(5)结果处理循环和MainO方法中的其余代码与前面例子中的相同。编译并执行程序,下面是分组结果:
Total : By
Sales : Region
----- -----
52997 : Asia
16999 : North America
12444 : Europe
8558 : South America
7000 : Africa
示例说明
Customer类和customers列表的初始化与前面例子中的相同。
分组查询中的数据通过一个键(key)字段来分组,每个组中的所有成员都共享这个字段值。在这个例子中,键字段是Region:
group c by c.Region
要计算每个组的总和,应生成一个新的结果集eg:
group c by c.Region into eg
在select子句中,投影了一个新的匿名类型,其属性是总销售量(通过引用eg结果集来计算)和组的键值, 后者是用特殊的组Key来引用的:
select new { TotalSales = eg.Sum(c => c.Sales), Region = eg.Key }
组的结果集实现了UNQ接口 IGrouping,它支持Key属性。我们总以某种方式引用Key属性,来处理分组结果,因为该属性表示创建数据中的每个组时使用的条件。
要按TotalSales字段对结果降序排序,以便查看哪个区域的销售置最高、哪个区域的销售量次高等,需要创建第二个査询,对分组查询的结果排序:
var orderedResults =
from eg in queryResults
orderby cg.TotalSales descending
select eg
;
第二个査询是一个标准的select査询,带一个ordeiby子句,与前面示例中的相同。但它没有使用任何UNQ分组功能,只是数据源来自于前面的分组査询。
接着输出结果,用一些格式化代码显示带有列标题的数据,在总销售量与组名之间显示了分隔符:
WriteLine("Total\t: By\nSales\t: Region\n---\t ---");
foreach (var item in orderedResults)
{
WriteLine($"{item. TotaISales}\t: {item. Region}");
};
可以用更复杂的方式进行格式化,指定字段宽度,总销售量右对齐,但这只是一个例子,不需要这么多格式,能看清数据,理解代码做了些什么就足够了。
点击加载更多评论>>