[原文作者]:Bill Horst
[原文地址]:Converting SQL to LINQ, Part 5: GROUP BY and HAVING (Bill Horst)
本文假定您已阅读过本系列中此前发表的文章:
从SQL 到 LINQ, Part 1: 基础(Bill Horst)
从SQL 到 LINQ, Part 2: FROM 和 SELECT(Bill Horst)
Converting SQL to LINQ, Part 3: DISTINCT, WHERE, ORDER BY and Operators
Converting SQL to LINQ, Part 4: Functions
本文将讨论GROUP BY和HAVING子句.
GROUP BY
一个SQL GROUP BY 子句使你能够依据特定的字段把记录分组, 从而可以一次处理整个分组. 一个LINQ语句也可以包含一个Group By子句, 但语法有所不同. 下面是一个不正规 (也不完整) 的语法表达式:
|
VB Group By |
|
Group [{optional list of fields}] By {list of fields} _ Into {list of aggregate expressions}
|
在这个语法中列出来的所有表达式都可以有别名, 并且当一个标识不能被确定时必须使用别名. 一般说来, 子句首先是一个”Group By”, 其后有一个用来分组的字段的列表; 接着是一个 ”Into”, 其后是要进行集合计算的集合表达式. 例如, 下面的查询计算发送到每个邮政编码的总运输费用和平均运输费用:
|
VB |
|
From Shipment In OrderTable _ Group By Shipment.ShippingZip _ Into Total = Sum(Shipment.Cost), Average(Shipment.Cost) |
这个查询为数据表中存在的每个邮政编码返回3个值: 邮政编码, 运输费用总计和平均运输费用.
可选地, 在"Group” 和 "By” 关键字之间可以指定字段来减少某些字段中包含的信息. 这可以被看作是一个内置的, 在Into子句之前的Select子句:
|
VB |
|
From Shipment In OrderTable _ Group OrderCost = Shipment.Cost By Shipment.ShippingZip _ Into Total = Sum(OrderCost), Average(OrderCost) |
作为对集合表达式的补充, Into子句也可以包含 “Group” 关键字, 它的作用是使分组中的每个记录成为一个数组成员. 下面这个查询为数据中存在的每个邮政编码和订货日期的组合返回两组值, 邮政编码和订货日期, 加上一个包含分组中所有记录的数组.
|
VB |
|
From Shipment In OrderTable _ Group By Zip = Shipment.ShippingZip, Shipment.OrderDate _ Into Group |
如果"Group” 和" By” 之间没有指明字段, 如上所示, 则返回的数组中包含所有字段. 下面这个查询为数据中存在的每个邮政编码和订货日期的组合, 返回分组中每条记录的邮政编码和订货日期, 以及ID和支出两个字段组成的数组.
|
VB |
|
From Shipment In OrderTable _ Group ID = Shipment.OrderID, Shipment.Cost By _ Zip = Shipment.ShippingZip, Shipment.OrderDate _ Into Group |
因为语法确实很复杂, 我已给出了好几个例子, 现在我们开始看一下如何转换各种包含GROUP BY 子句的SQL语句到VB. 下面是一个例子:
|
SQL |
|
SELECT OrderDate Date_Of_Order, SUM(Cost) Daily_Total FROM OrderTable GROUP BY Date_Of_Order
|
|
VB |
|
From Shipment In OrderTable _ Group By Date_Of_Order = Shipment.OrderDate _ Into Daily_Total = Sum(Shipment.Cost)
|
Having
Having 是另一个可以在查询结果中指定分组条件的SQL子句. VB中没有类似的子句, 所以用VB LINQ实现它的最好的方式是在Group By子句后使用一个Where子句, 如下所示:
|
SQL |
|
SELECT OrderDate Date_Of_Order, SUM(Cost) Total_Cost FROM OrderTable GROUP BY Date_Of_Order HAVING SUM(Cost) > 1000
|
|
VB |
|
From Shipment In OrderTable _ Group By Date_Of_Order = Shipment.OrderDate _ Into Total_Cost = Sum(Shipment.Cost) Where Total_Cost > 1000
|
在下一篇文章中, 我打算讨论各种各样的联接.
- Bill Horst, VB IDE Test
打印 | 张贴于 2008-01-28 13:10:00 | Tag:VB Team Blog Converting SQL to LINQ
留言反馈