您的位置:首页 > 编程语言 > C#

[转]C#3.0入门系列(八)-之GroupBy操作

2009-04-02 18:02 393 查看
换一种写作风格。本节讲groupby操作。

在所有的Linq To Sql操作中,GroupBy是最难理解的一个。因为,这里和Sql的出入较大。而Group真的就能返回n多组。

打开vs,新建一工程,加入System.Data.Linq.dll的引用。把northwind数据库做个映射,添加到工程里。创建一Northwind类的对象。在这里呢,我们要做分组统计,我们要先明白什么是分组。在我们开始设计product表时,我们欲留了一列叫做CategoryID。 这个字段,代表了这条记录中的产品,归属于那个类别。如图,字段的设计。

var q =

from p in db.Products

group p by p.CategoryID into g

select g;
在这里,from p in db.Products 表示从表中将对象纪录取出来。p就是每一个产品。而后面一句,group p by p.CategoryID into g表示对p进行归类,按什么归类呢,就是要按我们设定的CategoryID这个字段。而这个归类的结果,被重新命名为g,而且是必须重新命名。一旦重新命名,p的作用域就结束了,所以,最后select时,只能select g。

那有人就要问了,不重新命名可以吗?回答,可以。那你的select语句就没有了,上面语句等同与

var q = from p in db.Products

group p by p.CategoryID;
这是query表达式中,很少见的没有select语句的情况。我记忆中,好像只有此一种。我们还是按

var q =

from p in db.Products

group p by p.CategoryID into g

select g;

来讲解。因为这种更好理解。在T-Sql中,groupby只是用来做分组统计,计算平均值,最大值,求和等等,而在dlinq中的groupby,则发挥到了极值。我们用ToList()取到结果,来看看上面语句返回的结果。如图:

Northwind db = new Northwind(ConStr);

db.Log = Console.Out;

SELECT [t0].[CategoryID] AS [Key]

FROM [Products] AS [t0]

GROUP BY [t0].[CategoryID]

-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0

SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID

], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnO

rder], [t0].[ReorderLevel], [t0].[Discontinued]

FROM [Products] AS [t0]

WHERE ((@x1 IS NULL) AND ([t0].[CategoryID] IS NULL)) OR ((@x1 IS NOT NULL) AND

([t0].[CategoryID] IS NOT NULL) AND (@x1 = [t0].[CategoryID]))

-- @x1: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]

-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0

原来dlinq不仅仅是做了一个groupby操作呀,他还针对每个组,都去做了一个遍历呀。我们可以用下面的图来理解。

var q = from p in db.Products

group p by p.CategoryID into g

select g;

foreach (var gp in q)

{

if (gp.Key == 7)

{

foreach (var p in gp)

{

//do something

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: