LINQ简介
LINQ全称是Language Integrated Query,中文叫语言集成查询。
官方的概述是:Language-Integrated 查询(LINQ)是基于将查询功能直接集成到 C# 语言的一组技术的名称。 传统上,针对数据的查询表示为简单字符串,无需在编译时进行类型检查或 IntelliSense 支持。 此外,必须了解每种数据源类型的不同查询语言:SQL 数据库、XML 文档、各种 Web 服务等。 使用 LINQ 时,查询是一流的语言构造,就像类、方法和事件一样。
所有 LINQ 查询操作都包括三个不同的动作。
- 获取数据源。
- 创建查询。
- 执行查询。
下图显示了完整的查询操作。 在 LINQ 中,查询的执行与查询本身不同。 换句话说,不会通过创建查询变量来检索任何数据。

数据源
前面的示例中的数据源是一个支持泛型 IEnumerable<T> 接口的数组。 此事实意味着可以使用 LINQ 对其进行查询。 查询在foreach 语句中执行,并且foreach 需要IEnumerable 或IEnumerable<T>。 支持 IEnumerable<T> 或派生接口的类型(如泛型 IQueryable<T> )称为 可查询类型。
使用 EntityFramework,可以在 C# 类和数据库架构之间创建对象关系映射。 针对对象编写查询,在运行时 EntityFramework 处理与数据库的通信。 在下面的示例中, Customers 表示数据库中的特定表,以及查询结果 IQueryable<T>的类型,派生自 IEnumerable<T>。
Northwnd db = new Northwnd(@"c:\northwnd.mdf"); // Query for customers in London. IQueryable<Customer> custQuery = from cust in db.Customers where cust.City == "London" select cust;
查询
查询指定要从数据源或源检索的信息。 (可选)查询还指定在返回之前应如何对信息进行排序、分组和调整。 查询存储在查询变量中,并使用查询表达式进行初始化。 使用 C# 查询语法 编写查询。
查询表达式包含三个子句: from、 where和 select。 (如果熟悉 SQL,请注意子句的排序与 SQL 中的顺序相反。该 from 子句指定数据源、 where 子句应用筛选器,子 select 句指定返回的元素的类型。 在 LINQ 中,查询变量本身不执行任何操作,不返回任何数据。 它只存储在稍后执行查询时生成结果所需的信息。
按执行方式对标准查询运算符进行分类
标准查询运算符方法的 LINQ to Objects 实现以两种主要方式之一执行: 立即执行 或 延迟执行。 使用延迟执行的查询运算符可以另外分为两个类别: 流式处理 和非 流式处理。
立即执行
立即执行意味着将读取数据源,并执行一次操作。 所有返回标量结果的标准查询运算符均立即执行。 此类查询的示例包括Count、Max和AverageFirst。
立即执行可重用查询结果,而不是查询声明。 检索结果一次,然后存储以供将来使用。 下面的查询返回源数组中偶数的计数:
var evenNumQuery = from num in numbers where (num % 2) == 0 select num; int evenNumCount = evenNumQuery.Count();
若要强制立即执行任何查询并缓存其结果,可以调用 ToList 或 ToArray 方法。
List<int> numQuery2 = (from num in numbers where (num % 2) == 0 select num).ToList(); // or like this: // numQuery3 is still an int[] var numQuery3 = (from num in numbers where (num % 2) == 0 select num).ToArray();
延迟执行
延迟执行意味着操作不会在查询声明所在的代码点执行。 仅当枚举查询变量时,才执行该作,例如使用 foreach 语句。 执行查询的结果取决于执行查询时数据源的内容,而不是定义查询的时间。
以下代码演示延迟执行的示例:
foreach (int num in numQuery) { Console.Write("{0,1} ", num); }
浙公网安备 33010602011771号