语言集成查询:LINQ
LINQ(Language Integrated Query,语言集成查询)是 Microsoft 在 .NET Framework 3.5 中引入的一种强大的查询技术,用于在 .NET 编程语言中以声明式的方式查询和操作数据。LINQ 提供了一种统一的查询语法,可以用于查询各种数据源,包括内存中的集合(如数组、列表)、数据库(如 SQL Server)、XML 文档等。
1、LINQ 的主要特点
统一的查询语法:LINQ 提供了一种统一的查询语法,使得开发者可以使用相同的语法查询不同类型的数据源。
例如,你可以用相同的查询语法查询内存中的列表和数据库中的表。
类型安全:LINQ 查询在编译时进行类型检查,减少了运行时错误。
这使得代码更加健壮,易于维护。
延迟执行:LINQ 查询通常采用延迟执行(Lazy Evaluation),即查询不会立即执行,而是在需要时才执行。
这可以提高性能,特别是在处理大数据集时。
扩展性:LINQ 提供了丰富的扩展方法,使得开发者可以轻松地扩展查询功能。
例如,你可以通过扩展方法添加自定义的查询操作。
2、LINQ 的主要组成部分
2.1、LINQ to Objects
用于查询内存中的集合,如数组、列表等。例如:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
2.2、LINQ to SQL
用于查询和操作关系数据库,如 SQL Server。例如:
using (var db = new MyDbContext())
{
var customers = db.Customers.Where(c => c.City == "London");
}
2.3、LINQ to XML
用于查询和操作 XML 数据。例如:
XDocument doc = XDocument.Load("books.xml");
var books = doc.Descendants("book")
.Where(b => (string)b.Element("author") == "AuthorName");
2.4、LINQ to Entities
用于查询和操作 Entity Framework 的数据模型。例如:
using (var context = new MyDbContext())
{
var products = context.Products
.Where(p => p.Price > 100)
.Select(p => p.Name);
}
3、LINQ 的查询语法
LINQ 提供了两种主要的查询语法:方法链式语法(Method Syntax)和查询表达式语法(Query Expression Syntax)。
3.1、方法链式语法
方法链式语法使用扩展方法来构建查询。例如:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).Select(n => n * 2);
3.2、查询表达式语法
查询表达式语法使用类似 SQL 的语法来构建查询。例如:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = from n in numbers
where n % 2 == 0
select n * 2;
4、LINQ 的常见操作
过滤(Filtering):使用 Where 方法过滤数据。例如:numbers.Where(n => n > 3)
投影(Projection):使用 Select 方法投影数据。例如:numbers.Select(n => n * 2)
排序(Sorting):使用 OrderBy 和 OrderByDescending 方法排序数据。例如:numbers.OrderBy(n => n)
分组(Grouping):使用 GroupBy 方法对数据进行分组。例如:numbers.GroupBy(n => n % 2)
聚合(Aggregation):使用 Count、Sum、Max、Min 等方法对数据进行聚合操作。例如:numbers.Count()
LINQ 是一种强大的查询技术,它通过统一的查询语法,使开发者能够以声明式的方式查询和操作各种数据源。LINQ 提供了丰富的扩展方法和两种主要的查询语法(方法链式语法和查询表达式语法),使得代码更加简洁、易读和易于维护。
5、 LINQ 查询示例
展示如何使用 LINQ 查询内存中的集合:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
// 创建一个列表
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 使用方法链式语法
var evenNumbers = numbers
.Where(n => n % 2 == 0) // 过滤偶数
.Select(n => n * 2) // 将每个偶数乘以2
.OrderByDescending(n => n); // 按降序排序
// 输出结果
foreach (var number in evenNumbers)
{
Console.WriteLine(number);
}
// 使用查询表达式语法
var evenNumbersQuery = from n in numbers
where n % 2 == 0
select n * 2 into result
orderby result descending
select result;
// 输出结果
foreach (var number in evenNumbersQuery)
{
Console.WriteLine(number);
}
}
}