LINQ 的分组聚合技术

  • Jonathan Allen
  • 张海龙

2008 年 1 月 7 日

话题:.NETDevOps语言 & 开发架构

很大程度上来讲,LINQ 的工作方式很像 SQL。查询源定义、join、select 和 where 子句都是相当标准的,而 Group/By/Into 子句则正是我们这里要仔细说明的。SQL 总是返回矩阵式数据集,与它不同的是,LINQ 具备了返回层次化数据的能力,这也给它自己带来了更多新的挑战。

举一个例子,将客户按照所属 country 和 city 进行分组查询,在 SQL 中,可能会通过在客户端手动分组或者执行 1+N+(N*M)次查询来实现,一个查询用来获取所有的国家,一个查询用来获取每个国家的所有城市,然后再逐个查询出每个国家的每个城市下所有的客户列表。

而在 LINQ 中,它可以通过一个带有一系列子查询的查询语句一次性完成,当然,这也增加了查询的复杂度。Mitsu 演示如下:

var q =

from c in db.Customers

group c by c.Country into g

select new {

g.Key,

Count = g.Count(),

SubGroups = from c in g

group c by c.City into g2

select g2};

为说明 LINQ 框架的灵活性,Mitsu 将它简化到了仅一行:

var result = customers.GroupByMany(c => c.Country, c => c.City);

Mitsu 用一种能适用于任何 LINQ 查询的方式实现了它。你可以在他的博客上查看源码以及关于它是如何工作的解释文章。

查看英文原文LINQ Grouping Techniques



.NETDevOps语言 & 开发架构