C# 分組查詢
分組查詢(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ù),理解代碼做了些什么就足夠了。
點擊加載更多評論>>