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

来源:互联网 发布:轨迹软件 编辑:程序博客网 时间:2024/06/05 22:02

语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上。 借助于 LINQ,查询现在已是高级语言构造,就如同类、方法、事件等等。
对于编写查询的开发人员来说,LINQ 最明显的“语言集成”部分是查询表达式。 查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的。 通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作。 您使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO.NET 数据集、XML 文档和流以及 .NET 集合中的数据。
下面的示例演示了完整的查询操作。 完整操作包括创建数据源、定义查询表达式,以及在 foreach 语句中执行查询。

  class LINQQueryExpressions    {        static void Main()        {            // Specify the data source.            int[] scores = new int[] { 97, 92, 81, 60 };            // Define the query expression.            IEnumerable<int> scoreQuery =                from score in scores                where score > 80                select score;            // Execute the query.            foreach (int i in scoreQuery)            {                Console.Write(i + " ");            }                    }    }    // Output: 97 92 81

什么是查询?它有什么用途?

“查询”是指一组指令,这些指令描述要从一个或多个给定数据源检索的数据以及返回的数据应该使用的格式和组织形式。 查询不同于它所产生的结果。
通常,源数据会在逻辑上组织为相同种类的元素序列。 SQL 数据库表包含一个行序列。 与此类似,ADO.NET DataTable 包含一个 DataRow 对象序列。 在 XML 文件中,有一个 XML 元素“序列”(不过这些元素按分层形式组织为树结构)。 内存中的集合包含一个对象序列。
从应用程序的角度来看,原始源数据的具体类型和结构并不重要。 应用程序始终将源数据视为一个 IEnumerable 或 IQueryable 集合。 在 LINQ to XML 中,源数据显示为一个 IEnumerable。 在 LINQ to DataSet 中,它是一个 IEnumerable。 在 LINQ to SQL 中,它是您定义用来表示 SQL 表中数据的任何自定义对象的 IEnumerable 或 IQueryable。

指定此源序列后,查询可以进行下列三项工作之一:

  • 检索一个元素子集以产生一个新序列,但不修改单个元素。 然后,查询可以按各种方式对返回的序列进行排序或分组,如下面的示例所示(假定 scores 是 int[]):
  IEnumerable<int> highScoresQuery =                from score in scores                where score > 80                orderby score descending                select score;
  • 如上一个示例所述检索一个元素序列,但是将这些元素转换为具有新类型的对象。 例如,查询可以只从数据源中的某些客户记录检索姓氏。 或者,查询可以检索完整的记录,再使用它构建另一个内存中对象类型甚至 XML 数据,然后生成最终的结果序列。 下面的示例演示了从 int 到 string 的转换。 请注意 highScoresQuery 的新类型。
 IEnumerable<string> highScoresQuery2 =                from score in scores                where score > 80                orderby score descending                select String.Format("The score is {0}", score);
  • 检索有关源数据的单一值,例如:
    • 符合某个条件的元素的数量。
      符合某个条件的第一个元素,或一组指定元素中的特定值之和。 例如,下面的查询从 scores 整数数组中返回高于 80 的分数的数量。
   int highScoreCount =                (from score in scores                 where score > 80                 select score)                 .Count();
  • 在上一个示例中,请注意在 Count 方法调用之前的查询表达式两旁使用了括号。 另一种表示方式是使用一个新变量来存储具体结果。 此技术的可读性更好,因为它将存储查询的变量与存储结果的查询区分开来。
     IEnumerable<int> highScoresQuery3 =                from score in scores                where score > 80                select score;            int scoreCount = highScoresQuery3.Count();

在上一个示例中,查询是在 Count 调用中执行的,因为 Count 必须循环访问结果以便确定 highScoresQuery 返回的元素数量。

什么是查询表达式?

“查询表达式”是用查询语法表示的查询, 是一流的语言构造。 它就像任何其他表达式一样,并且可以用在 C# 表达式有效的任何上下文中。 查询表达式由一组用类似于 SQL 或 XQuery 的声明性语法编写的子句组成。 每个子句又包含一个或多个 C# 表达式,而这些表达式本身又可能是查询表达式或包含查询表达式。
查询表达式必须以 from 子句开头,并且必须以 select 或 group 子句结尾。 在第一个 from 子句和最后一个 select 或 group 子句之间,查询表达式可以包含一个或多个下列可选子句:where、orderby、join、let 甚至附加的 from 子句。 还可以使用 into 关键字使 join 或 group 子句的结果能够充当同一查询表达式中附加查询子句的源。

查询变量

在 LINQ 中,查询变量是任何存储查询(而非查询结果)的变量。更具体地说,查询变量始终是一个可枚举的类型,当在 foreach 语句中或在对其 IEnumerator.MoveNext 方法的直接调用中循环访问它时,它会生成一序列元素。
下面的代码示例演示了一个简单的查询表达式,它含有一个数据源、一个筛选子句和一个排序子句,但不对源元素进行转换。 select 子句结束了该查询。

  static void Main()        {            // Data source.            int[] scores = { 90, 71, 82, 93, 75, 82 };            // Query Expression.            IEnumerable<int> scoreQuery = //query variable                from score in scores //required                where score > 80 // optional                orderby score descending // optional                select score; //must end with select or group            // Execute the query to produce the results            foreach (int testScore in scoreQuery)            {                Console.WriteLine(testScore);            }                          }        // Outputs: 93 90 82 82      

标准的查询操作符

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

https://msdn.microsoft.com/zh-cn/library/bb384065.aspx

0 0