LINQ学习笔记三-----基本查询操作

来源:互联网 发布:后盾网linux视频教程 编辑:程序博客网 时间:2024/05/21 10:30

LINQ学习笔记三-----基本查询操作(来自微软MSDN  )

 

基本查询操作 (Visual Basic)
本主题简要介绍 Visual Basic 中的语言集成查询 (LINQ) 表达式,以及您在查询中执行的一些典型类型的运算。
1指定数据源 (From)
LINQ 查询中,第一步是指定要查询的数据源。因此,查询中的 From 子句总是最先出现。查询运算符根据源的类型选择结果并设置结果的形式。
Visual Basic
Dim query = From cust In customers _
'           ...
From 子句指定数据源 customers 和范围变量 cust。范围变量类似于循环迭代变量,但在查询表达式中,实际上不发生迭代。执行查询(通常使用 For Each 循环执行)时,范围变量将用作对 customers 中的每个后续元素的引用。由于编译器可以推断 cust 的类型,因此您不需要显式指定此类型。
2筛选数据 (Where)
也许最常用的查询操作是应用布尔表达式形式的筛选器。因此,这种查询只返回那些表达式结果为 true 的元素。Where子句用于执行筛选。筛选器指定要在结果序列中包含数据源中的哪些元素。在下面的示例中,只包含那些地址位于伦敦的客户。
Visual Basic
Dim londonCusts = From cust In customers _
                  Where cust.City = "London" _
'                 ...
您可以使用逻辑运算符(如 And Or)将筛选器表达式组合在 Where 子句中。
例如,若要只返回位于伦敦并且姓名为 Devon 的客户,请使用下面的代码:
Visual Basic
Where cust.City = "London" And cust.Name = "Devon" _
若要返回位于伦敦或巴黎的客户,请使用下面的代码:
Visual Basic
Where cust.City = "London" Or cust.City = "Paris" _
 
 
3对数据进行排序 (Order By)
将返回的数据按特定的顺序排列通常会带来方便。Order By子句将使所返回序列中的元素按指定的一个或多个字段排序。例如,下面的查询基于 Name 属性对结果排序。由于 Name 是一个字符串,因此返回的数据将按字母 A 到 Z 的顺序排序。
Visual Basic
Dim londonCusts1 = From cust In customers _
                    Where cust.City = "London" _
                    Order By cust.Name Ascending _
'                   ...
若要按相反顺序(从 Z A)对结果排序,请使用 Order By...Descending 子句。如果 Ascending Descending 都未指定,则默认为 Ascending
 
 
4选择数据 (Select)
Select子句指定所返回元素的形式和内容。例如,您可以指定结果包含的是整个 Customer 对象、仅一个 Customer 属性、属性的子集、来自不同数据源的属性的组合,还是一些基于计算的新结果类型。当 Select 子句生成除源元素副本以外的内容时,该操作称为“投影”。
若要检索包含整个 Customer 对象的集合,请选择范围变量本身:
Visual Basic
Dim londonCusts2 = From cust In customers _
                   Where cust.City = "London" _
                   Order By cust.Name Ascending _
                   Select cust
 
如果 Customer 实例是一个包含许多字段的大型对象,而您要检索的只是名称,则可以选择 cust.Name,如下面的示例所示。局部类型推理知道此操作会将结果类型从Customer 对象集合更改为字符串集合。
Visual Basic
Dim londonCusts3 = From cust In customers _
                   Where cust.City = "London" _
                   Order By cust.Name Ascending _
                   Select cust.Name
 
若要从数据源中选择多个字段,您可以使用两种方法:
· Select 子句中,指定要包含在结果中的字段。编译器将定义一个匿名类型,该类型将这些字段作为其属性
由于下面示例中的返回元素是匿名类型的实例,因此您无法在代码中的其他位置按名称引用该类型。编译器为该类型指定的名称含有在普通 Visual Basic 代码中无效的字符。在下面的示例中,londonCusts4 内的查询返回的集合中的元素是某个匿名类型的实例
Visual Basic
Dim londonCusts4 = From cust In customers _
                   Where cust.City = "London" _
                   Order By cust.Name Ascending _
                   Select Name = cust.Name, Phone = cust.Phone
 
For Each londonCust In londonCusts4
    Console.WriteLine(londonCust.Name & " " & londonCust.Phone)
Next
- 或 -
·定义含有您要包括在结果中的特定字段的命名类型,并在 Select 子句中创建和初始化该类型的实例。仅当您必须在返回各个结果的集合以外使用这些结果,或者必须将这些结果作为参数传入方法调用时,才使用此选项。下面的示例中的 londonCusts5 类型是 IEnumerable(Of NamePhone)。
Visual Basic
Public Class NamePhone
    Public Name As String
    Public Phone As String
    ' Additional class elements
End Class
 
Visual Basic
Dim londonCusts5 = From cust In customers _
                   Where cust.City = "London" _
                   Order By cust.Name Ascending _
                   Select New NamePhone With {.Name = cust.Name, _
                                              .Phone = cust.Phone}
 
5联接数据(Join Group Join
 
您可以使用多种方法将多个数据源组合到 From 子句中。例如,下面的代码使用两个数据源并将来自这二者的属性隐式组合在结果中。该查询选择姓氏以元音开头的学生。
Visual Basic
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels _
                 Where student.Last.IndexOf(vowel) = 0 _
                 Select Name = student.First & " " & _
                 student.Last, Initial = vowel _
                 Order By Initial
 
For Each vName In vowelNames
    Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
 
Join关键字等效于 SQL 中的 INNER JOIN。它基于两个集合中的元素之间的匹配键值对这两个集合进行组合。该查询返回包含这些匹配键值的全部或部分集合元素。例如,下面的代码复制上面的隐式联接操作。
Visual Basic
Dim vowelNames2 = From student In students _
                  Join vowel In vowels _
                  On student.Last(0) Equals vowel _
                  Select Name = student.First & " " & _
                  student.Last, Initial = vowel _
                  Order By Initial
 
Group Join 将多个集合组合为单个分层集合,就像 SQL 中的 LEFT JOIN
 
6对数据进行分组 (Group By)
您可以添加 Group By 子句,以根据元素的一个或多个字段对查询结果中的元素进行分组。例如,下面的代码按年级 (class year) 对学生进行分组。
Visual Basic
Dim studentsByYear = From student In students _
                     Select student _
                     Group By year = student.Year _
                     Into Classes = Group
 
For Each yearGroup In studentsByYear
    Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
    For Each student In yearGroup.Classes
        Console.WriteLine("   " & student.Last & ", " & student.First)
    Next
Next
 
如果您使用如何:创建项列表 For Each 语句将输出:中创建的学生列表运行此代码,则
Year: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
    
Year: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
    
Year: Freshman
Mortensen, Sven
Garcia, Cesar
下面显示的代码变体对年级排序,然后对每个年级的学生按姓氏排序。
Visual Basic
Dim studentsByYear2 = From student In students _
                      Select student _
                      Order By student.Year, student.Last _
                      Group By year = student.Year _
                      Into Classes = Group
 
 
原创粉丝点击