使用LINQ查询
LINQ是微软在C#中退出的语言集成查询技术。许多人将其看做微软的对象关系映射框架。LINQ不仅可以在数据库中查询,还可以在文本、xml等文件以及使用同一语法的数据源中查询数据,从而增加了应用对于数据的操作能力。
LINQ(语言级集成查询):把查询与设置等操作封装起来,用于实现更加灵活的数据查询机制。LINQ主要解决的是data!=objects的问题而产生的。现在有了table与class之间的映射,数据和对象之间就可以有一个一一对应的关系了。(在LINQ之前,java领域有Hibernate,.net领域有NHibernate)
LINQ查询语句的各个部分:
1)第一部分:from LINQ查询的一个生成器定义了数据源与范围变量。LINQ数据源可以是 任何实现System.Collections、Genric。Ieumerable<T>接口的任何集合。LINQ范围变量作为foreach循环中的一个迭代变量,对数据源惊醒循环迭代操作。
2)过滤器:第二部分是where语句,通常称为一个过滤器。过滤器是一个bool表达式,要 么返回true,要么返回FALSE。我们也可以用一个bool表达式作为过滤器。默认情况下, 查询表达式直到被访问时才计算结果。因此,在访问查询前,不会计算 Where 子句。所以如果值位于 Where 子句中使用的查询外部,请确保查询执行时在 Where 子句中使用适当的值。您可以在 Where 子句中调用函数,以便对集合中当前元素的值执行计算或运算。在 Where 子句中调用函数可使查询在定义后立即执行,而不是在访问时执行。
3)定义查询结果:最后一部分是sele语句。他定义查询结果。查询返回查询条件的对象。Select 子句指定所返回元素的形式和内容。若要检索包含整个数据源对象的集合,请选择范围变量本身。若要从数据源中选择多个字段,您可以使用两种方法:
1、在 Select 子句中,指定要包含在结果中的字段。编译器将定义一个匿名类 型,该类型将这些字段作为其属性。如:
m londonCusts4 = From cust In customers _
Where cust.City = "London" _
Order By cust.Name Ascending _
Select Name = cust.Name, Phone = cust.Phone
2、 4.2、定义含有您要包括在结果中的特定字段的命名类型,并在 Select 子句中创建和初始化该类型的实例。仅当您必须在返回各个结果的集合以外使用这些结果,或者必须将这些结果作为参数传入方法调用时,才使用此选项。
Dim londonCusts5 = From cust In customers _
Select New NamePhone With {.Name = cust.Name, _
.Phone = cust.Phone}
如果未指定 Select 子句,查询将根据为当前范围变量的所有成员返回一个类型。
Select 子句可以引用当前范围中的任何变量,包括在 From 子句中标识的范围变量,由 Aggregate、Let、Group By 或 Group Join 子句通过别名创建的任何新变量或查询表达式中之前的 Select 子句创建的变量。Select 子句还可以包含静态值。
Select 子句可为后续的其他子句子句引入一组新的范围变量,而之前的范围变量不再位于范围中,查询表达式中的最后一个 Select 子句确定查询的返回值。例如:
Dim customerList = From cust In customers, ord In cust.Orders _
Select Name = cust.CompanyName, _ '引入新范围变量
Total = ord.Total, ord.OrderID _ '引入新范围变量
Where Total > 500 _ '后续子句使用新的范围比例
Select Name, OrderID
4)对数据排序(ORDER BY):Order By 子句将使所返回序列中的元素按指定的一个或多个字段排序。若要按相反顺序(从 Z 到 A)对结果排序,请使用 Order By...Descending 子句。如果 Ascending 和 Descending 都未指定,则默认为 Ascending。
注意:如果要按照没有用于 Select 子句的字段对结果进行排序,则必须将 Order By 子句放在 Select 子句之前。
5)join与group join
您可以使用多种方法将多个数据源组合到 From 子句中。Join 关键字等效于 SQL 中的 INNER JOIN。它基于两个集合中的元素之间的匹配键值对这两个集合进行组合。GROUP JOIN相当于SQL中的LEFT OUTER JOIN,将多个集合组合为单个分层集合。可以在查询中使用多个 Join 子句,以便将两个或更多集合联接为单个集合。在不使用 Join 子句的情况下,可以执行隐式联接来组合集合。为此,应在 From 子句中包括多个 In 子句,并指定标识要用于联接的键的 Where 子句。
完整的语法:
Group Join element [As type] In collection _On key1 Equals key2 [ And key3 Equals key4 [... ] ] _Into expressionList
6)对数据进行分组(GROUP BY):根据元素的一个或多个字段对查询结果中的元素进行分组。
完整语法:
Group [ listField1 [, listField2 [...] ] By keyExp1 [, keyExp2 [...] ]Into aggregateList
LINQ推迟查询:
LINQ实现了推迟查询评估。意味着在查询表达式的生命与初始化的时候,查询实际上并不执行。事实上当程序对查询结果进行循环迭代时,查询才会被执行。在程序中可以对查询迭代多次。查询在每次迭代中都会重新评估。大多数情况下推迟查询评估是需要的。因为应用程序可能希望在每次运行查询的时候,从数据源获得最近的数据。但是如果希望缓存查询结果,以便后续处理,而不用重新执行查询时,要么调用toList(),要么调用ToArray()方法,保存结果到一个副本。
连接查询:
很多时候我们希望从多个数据源搜索对象。LINQ提供了join子句,用于连接多个查询数据 源。同SQl类似,join条件定义在on子句上。语法:DT1 join DT2 on 条件
Jion后面多个条件的表述:
方法1: 设置好外键就不用join了
方法2: on new{o.id,0.code} equals new {p.id,p.code} //推荐使用
方法3: var tmp=from m in table1 from n in table2 where m.id==n.id && m.code==n.code select new{...};
方法4: 把后面的条件放在where语句里面去.,彼此之间用&&
完整的LINQ语句:
1)from :FROM 范围变量 in 数据源
From 范围变量1 [ As 类型 ] In 集合 [ _ ][, 范围变量2 [ As 类型2 ] In 集合2 [, ... ] ]
2)where 可以使用逻辑运算符(如 And、Or、AndAlso、OrElse、Is 和 IsNot)可以将多个表达式组合在一个 Where 子句中
3)group by
4)into
5)orderby
3)select
扩展方法:采用C#编写的LINQ查询表达式转换为一系列方法的调用。这些方法被成为扩展方法