LINQ 概述
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。
借助 LINQ,查询成为了最高级的语言构造,就像类、方法和事件一样。可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询。
LINQ 查询系列:针对对象 (LINQ to Objects)、关系数据库 (LINQ to SQL) 和 XML (LINQ to XML)
LINQ 最明显的“语言集成”部分就是查询表达式。 查询表达式采用声明性查询语法编写而成。 使用查询语法,可以用最少的代码对数据源执行筛选、排序和分组操作。 可使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO .NET 数据集、XML 文档和流以及 .NET 集合中的数据。
在 C# 中可为以下对象编写 LINQ 查询:SQL Server 数据库、XML 文档、ADO.NET 数据集以及支持 IEnumerable 或泛型 IEnumerable 接口的任何对象集合。 此外,第三方也为许多 Web 服务和其他数据库实现提供了 LINQ 支持。
LINQ 和泛型类型
LINQ 查询基于 .NET Framework 版本 2.0 中引入的泛型类型。
2 个基本概念:
-
创建泛型集合类(如 List)的实例时,需将“T”替换为列表将包含的对象类型。 例如,字符串列表表示为 List,Customer 对象列表表示为 List。 泛型列表属于强类型,与将其元素存储为 Object 的集合相比,泛型列表具备更多优势。 如果尝试将 Customer 添加到 List,则会在编译时收到错误。 泛型集合易于使用的原因是不必执行运行时类型转换。
-
IEnumerable 是一个接口,通过该接口,可以使用 foreach 语句来枚举泛型集合类。 泛型集合类支持 IEnumerable,正如非泛型集合类(如 ArrayList)支持 IEnumerable。
LINQ 查询中的 IEnumerable 变量
LINQ 查询变量被类型化为 IEnumerable 或派生类型(如 IQueryable)。 看到类型化为 IEnumerable 的查询变量时,这只意味着执行查询时,该查询将生成包含零个或多个 Customer 对象的序列。
IEnumerable<Customer> customerQuery =
from cust in customers
where cust.City == "London"
select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
让编译器处理泛型类型声明
如果愿意,可以使用 var 关键字来避免使用泛型语法。 var 关键字指示编译器通过查看在 from 子句中指定的数据源来推断查询变量的类型。 以下示例生成与上例相同的编译代码:
var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;
foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}