5.3 LINQ基础
1. LINQ概述
LINQ(Language Integrated Query)是C#中一种强大的查询语言集成特性,允许开发者以声明式语法对数据集合(如数组、集合、数据库等)进行查询和操作。LINQ的核心优势在于:
- 统一语法:无论数据源是内存对象、XML还是数据库,查询语法保持一致。
- 编译时类型检查:减少运行时错误。
- 强类型支持:利用C#类型系统提高代码可读性和安全性。
2. LINQ查询语法
LINQ提供两种查询语法:查询表达式语法(类似SQL)和方法语法(基于扩展方法)。
2.1 查询表达式语法
var query = from student in students
where student.Age > 18
orderby student.Name
select student;
2.2 方法语法(链式调用)
var query = students
.Where(s => s.Age > 18)
.OrderBy(s => s.Name);
3. 常用LINQ操作符
| 类别 | 操作符示例 | 说明 |
|---|---|---|
| 筛选 | Where, OfType | 根据条件过滤数据 |
| 排序 | OrderBy, ThenBy, Reverse | 按指定字段排序 |
| 投影 | Select, SelectMany | 转换或展开数据 |
| 分组 | GroupBy, ToLookup | 按键值分组数据 |
| 聚合 | Count, Sum, Average | 计算统计值 |
| 集合 | Distinct, Union, Intersect | 集合操作 |
4. LINQ与不同数据源
4.1 LINQ to Objects
List<int> numbers = new List<int> { 1, 2, 3, 4 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
4.2 LINQ to XML
XDocument doc = XDocument.Load("data.xml");
var names = from element in doc.Descendants("name")
select element.Value;
4.3 LINQ to Entities (Entity Framework)
var query = context.Products
.Where(p => p.Price > 100)
.ToList();
5. 延迟执行与立即执行
- 延迟执行:查询定义时不立即执行(如
Where、Select) - 立即执行:调用
ToList()、Count()等时触发查询
var deferredQuery = data.Where(x => x > 10); // 未执行
var result = deferredQuery.ToList(); // 此时执行
6. 性能注意事项
- 避免重复查询:对同一数据源多次执行LINQ时缓存结果(
ToList()) - 复杂查询优化:使用
AsParallel()进行并行查询(需权衡线程开销) - 数据库查询:EF Core中注意生成的SQL语句是否高效
7. 实战示例:学生成绩查询
class Student {
public string Name { get; set; }
public int Score { get; set; }
}
List<Student> students = GetStudents();
// 查询分数大于80的学生并按姓名排序
var topStudents = students
.Where(s => s.Score > 80)
.OrderBy(s => s.Name)
.Select(s => new { s.Name, s.Score });
提示:LINQ Pad工具(https://www.linqpad.net/)是练习LINQ查询的理想环境。
下一节:6.1 委托的定义与使用
