引用:从SQL 到 LINQ, Part 4: 函数 (Bill Horst)
引用:从SQL 到 LINQ, Part 4: 函数 (Bill Horst)
[原文作者]: Bill Horst
[原文链接]: Converting SQL to LINQ, Part 4: Functions (Bill Horst)
在看这篇文章之前,我假定你已经读过了:
从SQL到LINQ,Part 3:DISTINCT, WHERE, ORDER BY 和 操作符
这篇文章讨论的是标量函数(scalar functions)和聚合函数(aggregate functions)。
函数
SQL的SELECT子句经常会涉及到函数,包含标量函数和聚合函数。一个聚合函数针对的是select出来的一组记录,而标量函数针对的则是其中的个体。我们可以利用VB LINQ表达式实现这两种操作-但是,方法有所不同。
标量函数(Scalar Functions)
标量函数不论参数如何操作的都是单个记录。他们可以在SQL查询的不同位置出现,比如SELCET子句。虽然标量函数会根据系统的不同而有所不同,但是我们总可以使用类似的VB方法在LINQ语句中进行模拟。如果在LINQ的Select子句中使用标量函数,你可能也需要指定一个别名(FirstThreeLetters, CurrentTime)。
|
SQL |
|
SELECT LEFT(ItemName, 3) FirstThreeLetters, NOW() CurrentTime FROM OrderTable |
|
VB |
|
From Shipment In OrderTable _ Select FirstThreeLetters = Left(Shipment.ItemName, 3), CurrentTime = Now |
在上面的例子中,Left和Now是VB已有的方法(在Microsoft.VisualBasic.dll里定义)。其实大多数SQL支持的标量方法都可以在VB中找到,即使你想调用的方法在VB里还不存在,你可以自己去定义它。但是,用户自定义的方法不能在数据库查询中使用,在运行时系统会抛出异常。在下面的例子中,MyFunction就是一个自定义的方法。
|
VB |
|
From Shipment In OrderTable _ Select MyFunction(Shipment.Cost, Shipment.ShippingZip) |
聚合函数(Aggregate Functions)
聚合函数操作的是整个集合,并返回一个值。在SQL语句中,他们可以出现在SLECT子句里。而在LINQ中,情况有所不同。
一个VB LINQ表达式通常由From子句开始,但是,也可以是Aggregate子句。Aggregate子句和From子句语法一样,一个由Aggregate开始的子句必须以Into子句结束。Into子句是一组带别名的,由逗号分割的,集合函数调用的列表(a comma-delimited list of Aggregate function calls, with aliases that can accompany them)。下面的例子展示了在SQL的SELECT语句中如何使用集合函数,以及其在LINQ中的等价操作。
|
SQL |
|
SELECT SUM(Cost) TotalCost, COUNT(*) FROM OrderTable WHERE OrderDate > “Sept-29-2007” |
|
VB |
|
Aggregate Shipment In OrderTable _ Where Shipment.OrderDate > #9/29/2007# _ Into TotalCost = Sum(Shipment.Cost), Count() |
下次,我们讨论GROUP BY 和 HAVING。

