引用:从SQL 到 LINQ, Part 4: 函数 (Bill Horst)

引用:从SQL 到 LINQ, Part 4: 函数 (Bill Horst)

[原文作者]: Bill Horst

[原文链接]: Converting SQL to LINQ, Part 4: Functions (Bill Horst)

 

在看这篇文章之前,我假定你已经读过了:

SQLLINQPart 1:基础

SQLLINQPart 2FROMSELECT

SQLLINQPart 3DISTINCT, WHERE, ORDER BY 操作符

 

这篇文章讨论的是标量函数(scalar functions)和聚合函数(aggregate functions)。

 

函数

SQLSELECT子句经常会涉及到函数,包含标量函数和聚合函数。一个聚合函数针对的是select出来的一组记录,而标量函数针对的则是其中的个体。我们可以利用VB LINQ表达式实现这两种操作-但是,方法有所不同。

 

标量函数(Scalar Functions

标量函数不论参数如何操作的都是单个记录。他们可以在SQL查询的不同位置出现,比如SELCET子句。虽然标量函数会根据系统的不同而有所不同,但是我们总可以使用类似的VB方法在LINQ语句中进行模拟。如果在LINQSelect子句中使用标量函数,你可能也需要指定一个别名(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

 

 

在上面的例子中,LeftNowVB已有的方法(在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)。下面的例子展示了在SQLSELECT语句中如何使用集合函数,以及其在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

你可能感兴趣的:(LINQ)