位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 分組查詢

提問人:劉團(tuán)圓發(fā)布時間:2020-12-11

    分組查詢(group query)把數(shù)據(jù)分解為組,允許按組來排序、計算聚合值以及進(jìn)行比較。這常常是商務(wù)環(huán)境中最有趣的查詢(它驅(qū)動了決策系統(tǒng))。例如,要按照國家或區(qū)域比較銷售量,確定在哪里開新店或雇用更多員工,如下例所示。


試一試  分組查詢:BeginningCSharp7—22_10_J3roupQuery\Program.cs

按照下面的步驟在Visual Studio 2017中創(chuàng)建示例:

(1)在 C:\BeginningCSharp7\Chapter22自錄中創(chuàng)建一個新的控M臺應(yīng)用程序 BeginnitigCSliarp7_22_lO_GroupQuery。

(2)如 BeginningCSharp7_22_8_SelectDistinctQuery 示例所示,創(chuàng)建 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處理循環(huán):

    WriteLine(MTotal\t: By\nSales\t: RegionNn-----\t ------");

    foreach (var item in orderedResults)

    {

        WriteLine($"{item.TotalSales}\t: {item.Region}");

    }

(5)結(jié)果處理循環(huán)和MainO方法中的其余代碼與前面例子中的相同。編譯并執(zhí)行程序,下面是分組結(jié)果:

Total : By 

Sales : Region

-----   -----

52997 : Asia

16999 : North America

12444 : Europe

8558  : South America

7000  : Africa


示例說明

  Customer類和customers列表的初始化與前面例子中的相同。

分組查詢中的數(shù)據(jù)通過一個鍵(key)字段來分組,每個組中的所有成員都共享這個字段值。在這個例子中,鍵字段是Region:

      group c by c.Region

  要計算每個組的總和,應(yīng)生成一個新的結(jié)果集eg:

      group c by c.Region into eg

  在select子句中,投影了一個新的匿名類型,其屬性是總銷售量(通過引用eg結(jié)果集來計算)和組的鍵值, 后者是用特殊的組Key來引用的:

      select new { TotalSales = eg.Sum(c => c.Sales), Region = eg.Key }

  組的結(jié)果集實現(xiàn)了UNQ接口 IGrouping,它支持Key屬性。我們總以某種方式引用Key屬性,來處理分組結(jié)果,因為該屬性表示創(chuàng)建數(shù)據(jù)中的每個組時使用的條件。

  要按TotalSales字段對結(jié)果降序排序,以便查看哪個區(qū)域的銷售置最高、哪個區(qū)域的銷售量次高等,需要創(chuàng)建第二個査詢,對分組查詢的結(jié)果排序:

      var orderedResults =

          from eg in queryResults 

          orderby cg.TotalSales descending 

          select eg

      ;

  第二個査詢是一個標(biāo)準(zhǔn)的select査詢,帶一個ordeiby子句,與前面示例中的相同。但它沒有使用任何UNQ分組功能,只是數(shù)據(jù)源來自于前面的分組査詢。

  接著輸出結(jié)果,用一些格式化代碼顯示帶有列標(biāo)題的數(shù)據(jù),在總銷售量與組名之間顯示了分隔符:

      WriteLine("Total\t: By\nSales\t: Region\n---\t ---");

      foreach (var item in orderedResults)

      {

          WriteLine($"{item. TotaISales}\t: {item. Region}");

      };

  可以用更復(fù)雜的方式進(jìn)行格式化,指定字段寬度,總銷售量右對齊,但這只是一個例子,不需要這么多格式,能看清數(shù)據(jù),理解代碼做了些什么就足夠了。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部