[原文作者]: Bill Horst
[原文链接]: Converting SQL to LINQ, Part 1: The Basics
你可能已经知道了,VB的LINQ指令允许使用类SQL语法的查询。LINQ的语法并不和SQL的语法完全一致,所以如果你现在已经在用SQL或者熟悉SQL查询的话,你可能会想把已经存在的SQL查询转化为LINQ。
这篇文章就是“从SQL到LINQ”系列的第一篇。在这篇文章里,我想让大家对SQL和LINQ的区别有一个基本的理解,下次我们会涉及到具体的语言架构。
假定
在接下来的例子, SQL代码会涉及到两个table:Customers和Orders,VB代码会用到与之同名的两个对象,他们的类型分别是IEnumerable(Of Customer)和IEnumerable(Of Order)。我还会用到两个类,同样是Customer和Order,如下:
|
Class Customer
Public CustomerID As Integer
Public Name As String
Public Phone As String
Public Address As String
Public City As String
Public State As String
Public Zip As String
End Class
Class Order
Public OrderID As Integer
Public CustomerID As Integer
Public Cost As Single
Public Phone As String
Public OrderDate As DateTime
Public ShippingZip As String
Public ItemName As String
End Class
|
基本语法
LINQ支持SQL SELECT语句,而不支持其他的,比如CREATE, INSERT, UPDATE 和 DELETE。你可以认为SQL SELECT语句的基本语法是一系列的“子句”(clauses),其中的第一个是SELECT子句。
|
sqlSelectClause [ sqlClause1 [ sqlClause2 [ ... ] ] ]
|
SQL的语法可能根据不同的版本有所差异,下面是一个例子:
|
SQL |
|
SELECT Name CustomerName, CustomerID ID
FROM Customers
ORDER BY ID
|
VB LINQ表达式的基本语法也是一系列的子句,不同的是第一个是From子句(或者Aggregate子句,我们稍后会讨论)。
|
linqFromClause [ linqClause1 [ linqClause2 [ ... ] ] ]
|
比如:
|
VB |
|
From cust In Customers _
Select CustomerName = cust.Name, ID = cust.CustomerID _
Order By ID
|
我刚才用了“VB LINQ表达式”的说法是因为前面的“LINQ查询”不是一个完整的语句。虽然SQL语句可以单独出现,但是LINQ查询在语法上和表达式“3 * 4”一样 - 它不是一个完整的语句,所以我们要使它完整。一个VB的完整的LINQ查询的语句看起来像这样:
|
VB |
|
Dim SortedCustomers = From cust In Customers _
Select CustomerName = cust.Name, ID = cust.CustomerID _
Order By ID
|
从概念上说,LINQ查询的每个子句操作的都是IEnumerable(Of T)类型并且返回的也是IEnumerable(Of T)类型”(其中的两个T并不一定要相同)。查询子句和SQL子句是基本类似的(比如SELECT, ORDER BY),所以你可以一个子句一个子句地将SQL查询转化成LINQ。在上面的例子里,这些子句出现的顺序稍有不同,而且有些语法上的差异,但是你可以看到,他们非常类似。
还要注意的一点是,SQL语法允许在子句间直接换行,而在VB里,换行需要在每行最后加上下划线(_)去告诉编译器下一行仍然是当前的表达式。
这篇文章只是一个泛泛的说明,但我会在以后讲到更为具体的内容。我打算涉及以下条目:
- FROM and SELECT
- DISTINCT, WHERE, ORDER BY, Operators
- Functions (Scalar and Aggregate)
- GROUP By and HAVING
- Joins
- UNION, TOP and Subqueries
- Bill Horst, VB IDE Test