当前位置: 首页 > 编程语言 > C# > 正文

C# 3.0入门系列(九)-之GroupBy操作

时间:2010-06-13 博客园 Tom Song

有朋友反馈说我提供的sample不能编译。大概是版本的问题,可以到http://msdn2.microsoft.com/en-us/bb330936.aspx下载for beta1的版本。本节接着讲groupby。

上一节,我们讲了如何理解groupby返回的结果。本节会延这个思路阐述下去。先来看下面的例子

GroupBy操作中Select的匿名类

var q = from p in db.Products
group p by p.CategoryID into g
select new { CategoryID = g.Key, g };

本例中,select操作中使用了匿名类。本系列中第一次提到匿名类是在http://www.cnblogs.com/126/archive/2006/12/20/503519.html一文中。本文将再一次,阐述匿名类的理解。所谓匿名类,其实质,并不是匿名,而是编译器帮你去创建了这么一个类,在用户看来,好像并没有去创建,此所谓匿名类。也就是说,编译器在编译时,还是有这个类的,这个类是编译器自己创建的,其名称是编译器界定的。 在上例的匿名类中,有2个property,一个叫CategoryID, 一个叫g。 大家要注意了,这个匿名类,其实质是对返回结果重新进行了包装。而那个叫做g的property,就封装了一个完整的分组。如图,仔细比较和上篇图的区别。

如果,使用下面的语句。

var q = from p in db.Products
group p by p.CategoryID into g
select new { CategoryID = g.Key,GroupSet = g };

只是把g重新命名为GroupSet.需要用下面的遍历,获取每个产品纪录。

foreach (var gp in q)
{
 if (gp.CategoryID == 7)
 { 
  foreach (var p in gp.GroupSet)
  {

  }
 }
}