位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 分组查询

提问人:刘团圆发布时间:2020-12-11

    分组查询(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}");

      };

  可以用更复杂的方式进行格式化,指定字段宽度,总销售量右对齐,但这只是一个例子,不需要这么多格式,能看清数据,理解代码做了些什么就足够了。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部