注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

SINOBANJO

IN GOD WE TRUST ! ~ ClueeZhuo

 
 
 
 
 

日志

 
 

基本 LINQ 查询操作  

2011-12-27 23:07:38|  分类: 班卓DB |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本主题简要介绍 LINQ 查询表达式,以及您在查询中执行的一些典型类型的操作。 
基本 LINQ 查询操作 - 班卓安迪 - banjoandy@163—班卓客鲁国际
 

下面各主题中提供了更详细的信息: 本主题简要介绍 LINQ 查询表达式,以及您在

查询中执行的一些典型类型的操作。 下面各主题中提供了更详细的信息: 

LINQ 查询表达式(C# 编程指南)

LINQ 查询表达式(C# 编程指南)

标准查询运算符概述

注意 
如果您已熟悉查询语言(如 SQL 或 XQuery),则可以跳过本主题的大部分内容。 

阅读下一节中的“from 子句”来了解 LINQ 查询表达式中的子句的顺序。 


获取数据源
-------------------------------------------------------------------------

-------

在 LINQ 查询中,第一步是指定数据源。 像在大多数编程语言中一样,在 C# 中,

必须先声明变量,才能使用它。 在 LINQ 查询中,最先使用 from 子句的目的是引

入数据源 (customers) 和范围变量 (cust)。 

C#复制

//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
                        select cust;


范围变量类似于 foreach 循环中的迭代变量,但在查询表达式中,实际上不发生迭

代。 执行查询时,范围变量将用作对 customers 中的每个后续元素的引用。 因为

编译器可以推断 cust 的类型,所以您不必显式指定此类型。 其他范围变量可由 

let 子句引入。 有关更多信息,请参见 let 子句(C# 参考)。 

注意  
对于非泛型数据源(如 ArrayList),必须显式类型化范围变量。 有关更多信息,

请参见如何:使用 LINQ 查询 ArrayList和 from 子句(C# 参考)。 


筛选
-------------------------------------------------------------------------

-------

也许最常用的查询操作是应用布尔表达式形式的筛选器。 此筛选器使查询只返回那

些表达式结果为 true 的元素。 使用 where 子句生成结果。 实际上,筛选器指定

从源序列中排除哪些元素。 在下面的示例中,只返回那些地址位于伦敦的 

customers。 

C#复制

var queryLondonCustomers = from cust in customers
                           where cust.City == "London"
                           select cust;


您可以使用熟悉的 C# 逻辑 AND 和 OR 运算符来根据需要在 where 子句中应用任

意数量的筛选表达式。 例如,若要只返回位于“伦敦”AND 姓名为“Devon”的客

户,您应编写下面的代码: 

C#复制

where cust.City=="London" && cust.Name == "Devon"


若要返回位于伦敦或巴黎的客户,您应编写下面的代码: 

C#复制

where cust.City == "London" || cust.City == "Paris"


有关更多信息,请参见 where 子句(C# 参考)。 

Ordering
-------------------------------------------------------------------------

-------

通常可以很方便地将返回的数据进行排序。 orderby 子句将使返回的序列中的元素

按照被排序的类型的默认比较器进行排序。 例如,下面的查询可以扩展为按 Name 

属性对结果进行排序。 因为 Name 是一个字符串,所以默认比较器执行从 A 到 Z 

的字母排序。 

C#复制

var queryLondonCustomers3 = 
    from cust in customers
    where cust.City == "London"
    orderby cust.Name ascending
    select cust;


若要按相反顺序(从 Z 到 A)对结果进行排序,请使用 orderby…descending 子

句。 

有关更多信息,请参见 orderby 子句(C# 参考)。 

分组
-------------------------------------------------------------------------

-------

使用 group 子句,您可以按指定的键分组结果。 例如,您可以指定结果应按 City 

分组,以便位于伦敦或巴黎的所有客户位于各自组中。 在本例中,cust.City 是键

。 

注意  
在下面的示例中,类型是显式的以更好地说明概念。 您也可以对 custQuery、

group 和 customer 使用隐式类型以让编译器确定准确的类型。 


C#复制

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
  var queryCustomersByCity =
      from cust in customers
      group cust by cust.City;

  // customerGroup is an IGrouping<string, Customer>
  foreach (var customerGroup in queryCustomersByCity)
  {
      Console.WriteLine(customerGroup.Key);
      foreach (Customer customer in customerGroup)
      {
          Console.WriteLine("    {0}", customer.Name);
      }
  }


在使用 group 子句结束查询时,结果采用列表的列表形式。 列表中的每个元素是

一个具有 Key 成员及根据该键分组的元素列表的对象。 在循环访问生成组序列的

查询时,您必须使用嵌套的 foreach 循环。 外部循环用于循环访问每个组,内部

循环用于循环访问每个组的成员。 

如果您必须引用组操作的结果,可以使用 into 关键字来创建可进一步查询的标识

符。 下面的查询只返回那些包含两个以上的客户的组: 

C#复制

// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;


有关更多信息,请参见 group 子句(C# 参考)。 

联接
-------------------------------------------------------------------------

-------

联接运算创建数据源中没有显式建模的序列之间的关联。 例如,您可以执行联接来

查找位于同一地点的所有客户和经销商。 在 LINQ 中,join 子句始终针对对象集

合而非直接针对数据库表运行。 

C#复制

var innerJoinQuery =
    from cust in customers
    join dist in distributors on cust.City equals dist.City
    select new { CustomerName = cust.Name, DistributorName = dist.Name };


在 LINQ 中,您不必像在 SQL 中那样频繁使用 join,因为 LINQ 中的外键在对象

模型中表示为包含项集合的属性。 例如,Customer 对象包含 Order 对象的集合。 

不必执行联接,只需使用点表示法访问订单: 

other复制
from order in Customer.Orders...

标准查询运算符概述

注意 
如果您已熟悉查询语言(如 SQL 或 XQuery),则可以跳过本主题的大部分内容。 

阅读下一节中的“from 子句”来了解 LINQ 查询表达式中的子句的顺序。 


获取数据源
-------------------------------------------------------------------------

-------

在 LINQ 查询中,第一步是指定数据源。 像在大多数编程语言中一样,在 C# 中,

必须先声明变量,才能使用它。 在 LINQ 查询中,最先使用 from 子句的目的是引

入数据源 (customers) 和范围变量 (cust)。 

C#复制

//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
                        select cust;


范围变量类似于 foreach 循环中的迭代变量,但在查询表达式中,实际上不发生迭

代。 执行查询时,范围变量将用作对 customers 中的每个后续元素的引用。 因为

编译器可以推断 cust 的类型,所以您不必显式指定此类型。 其他范围变量可由 

let 子句引入。 有关更多信息,请参见 let 子句(C# 参考)。 

注意  
对于非泛型数据源(如 ArrayList),必须显式类型化范围变量。 有关更多信息,

请参见如何:使用 LINQ 查询 ArrayList和 from 子句(C# 参考)。 


筛选
-------------------------------------------------------------------------

-------

也许最常用的查询操作是应用布尔表达式形式的筛选器。 此筛选器使查询只返回那

些表达式结果为 true 的元素。 使用 where 子句生成结果。 实际上,筛选器指定

从源序列中排除哪些元素。 在下面的示例中,只返回那些地址位于伦敦的 

customers。 

C#复制

var queryLondonCustomers = from cust in customers
                           where cust.City == "London"
                           select cust;


您可以使用熟悉的 C# 逻辑 AND 和 OR 运算符来根据需要在 where 子句中应用任

意数量的筛选表达式。 例如,若要只返回位于“伦敦”AND 姓名为“Devon”的客

户,您应编写下面的代码: 

C#复制

where cust.City=="London" && cust.Name == "Devon"


若要返回位于伦敦或巴黎的客户,您应编写下面的代码: 

C#复制

where cust.City == "London" || cust.City == "Paris"


有关更多信息,请参见 where 子句(C# 参考)。 

Ordering
-------------------------------------------------------------------------

-------

通常可以很方便地将返回的数据进行排序。 orderby 子句将使返回的序列中的元素

按照被排序的类型的默认比较器进行排序。 例如,下面的查询可以扩展为按 Name 

属性对结果进行排序。 因为 Name 是一个字符串,所以默认比较器执行从 A 到 Z 

的字母排序。 

C#复制

var queryLondonCustomers3 = 
    from cust in customers
    where cust.City == "London"
    orderby cust.Name ascending
    select cust;


若要按相反顺序(从 Z 到 A)对结果进行排序,请使用 orderby…descending 子

句。 

有关更多信息,请参见 orderby 子句(C# 参考)。 

分组
-------------------------------------------------------------------------

-------

使用 group 子句,您可以按指定的键分组结果。 例如,您可以指定结果应按 City 

分组,以便位于伦敦或巴黎的所有客户位于各自组中。 在本例中,cust.City 是键

。 

注意  
在下面的示例中,类型是显式的以更好地说明概念。 您也可以对 custQuery、

group 和 customer 使用隐式类型以让编译器确定准确的类型。 


C#复制

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
  var queryCustomersByCity =
      from cust in customers
      group cust by cust.City;

  // customerGroup is an IGrouping<string, Customer>
  foreach (var customerGroup in queryCustomersByCity)
  {
      Console.WriteLine(customerGroup.Key);
      foreach (Customer customer in customerGroup)
      {
          Console.WriteLine("    {0}", customer.Name);
      }
  }


在使用 group 子句结束查询时,结果采用列表的列表形式。 列表中的每个元素是

一个具有 Key 成员及根据该键分组的元素列表的对象。 在循环访问生成组序列的

查询时,您必须使用嵌套的 foreach 循环。 外部循环用于循环访问每个组,内部

循环用于循环访问每个组的成员。 

如果您必须引用组操作的结果,可以使用 into 关键字来创建可进一步查询的标识

符。 下面的查询只返回那些包含两个以上的客户的组: 

C#复制

// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;


有关更多信息,请参见 group 子句(C# 参考)。 

联接
-------------------------------------------------------------------------

-------

联接运算创建数据源中没有显式建模的序列之间的关联。 例如,您可以执行联接来

查找位于同一地点的所有客户和经销商。 在 LINQ 中,join 子句始终针对对象集

合而非直接针对数据库表运行。 

C#复制

var innerJoinQuery =
    from cust in customers
    join dist in distributors on cust.City equals dist.City
    select new { CustomerName = cust.Name, DistributorName = dist.Name };


在 LINQ 中,您不必像在 SQL 中那样频繁使用 join,因为 LINQ 中的外键在对象

模型中表示为包含项集合的属性。 例如,Customer 对象包含 Order 对象的集合。 

不必执行联接,只需使用点表示法访问订单: 

other复制
from order in Customer.Orders...
  评论这张
 
阅读(119)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017