C#20、什么是LINQ
在 C# 中,LINQ(Language Integrated Query,语言集成查询) 是 .NET 提供的一套强大而统一的数据查询语法,让你可以用类似 SQL 的方式,直接在 C# 代码中查询各种数据源(如数组、列表、数据库、XML 等)。
它的核心思想是:“用同一种方式查询不同来源的数据”。
✅ 为什么需要 LINQ?
在没有 LINQ 的时代:
- 查数组要用
for循环 - 查数据库要用 SQL 字符串
- 查 XML 要用 DOM 或 XPath
👉 每种数据源都有不同的查询方式,学习成本高,代码不统一。
LINQ 解决了这个问题:无论数据在哪,查询语法都一样!
✅ LINQ 能查哪些数据?
只要数据实现了 IEnumerable<T>(内存集合)或 IQueryable<T>(远程数据源,如数据库),就可以用 LINQ 查询:
| 数据源类型 | 示例 |
|---|---|
| 内存集合 | List<T>, Array, Dictionary |
| 数据库 | Entity Framework(EF Core)、LINQ to SQL |
| XML | LINQ to XML |
| 其他 | 自定义支持 IEnumerable<T> 的类型 |
✅ 两种 LINQ 语法
1. 查询表达式语法(Query Syntax) —— 类似 SQL
var result = from num in numberswhere num > 5orderby num descendingselect num;
2. 方法语法(Method Syntax / Fluent Syntax) —— 基于扩展方法(更常用)
var result = numbers.Where(num => num > 5).OrderByDescending(num => num);
💡 两者功能等价,编译后都会转成方法调用。方法语法更灵活,使用更广泛。
✅ 常见 LINQ 操作示例(以内存列表为例)
假设有一个学生列表:
var students = new List<Student>
{new Student { Name = "Alice", Age = 20, Score = 85 },new Student { Name = "Bob", Age = 22, Score = 90 },new Student { Name = "Charlie", Age = 19, Score = 78 }
};
🔍 查询:找出成绩 ≥ 80 的学生姓名,按年龄升序排列
// 方法语法(推荐)
var names = students.Where(s => s.Score >= 80).OrderBy(s => s.Age).Select(s => s.Name).ToList(); // 结果: ["Charlie", "Alice"]
📊 聚合操作
int count = students.Count(s => s.Age > 20); // 1
double avgScore = students.Average(s => s.Score); // 84.33...
Student top = students.MaxBy(s => s.Score); // Bob(C# 11+)
🔄 分组
var byAgeGroup = students.GroupBy(s => s.Age >= 20 ? "Adult" : "Teen");
✅ 核心 LINQ 方法(最常用)
| 方法 | 作用 |
|---|---|
Where | 筛选(相当于 SQL 的 WHERE) |
Select | 投影/转换(相当于 SQL 的 SELECT) |
OrderBy / OrderByDescending | 排序 |
GroupBy | 分组 |
Count, Sum, Average, Min, Max | 聚合计算 |
Any, All | 判断是否存在/是否全部满足条件 |
First, FirstOrDefault, Single, SingleOrDefault | 获取单个元素 |
✅ 延迟执行(Deferred Execution)—— 重要概念!
LINQ 查询不会立即执行,而是在你遍历结果或调用 .ToList() 等方法时才真正执行。
var query = students.Where(s => s.Score > 80); // ❌ 此时没查数据!foreach (var s in query) // ✅ 这里才执行查询
{Console.WriteLine(s.Name);
}
💡 好处:可以链式组合多个操作,最终只执行一次高效查询(尤其对数据库)。
✅ 实际应用场景
- 过滤 UI 列表数据
var filtered = allProducts.Where(p => p.Price < 100).ToList(); - 从 API 返回的数据中提取所需字段
- 配合 Entity Framework 查询数据库
var users = dbContext.Users.Where(u => u.IsActive).Select(u => u.Email).ToList(); - 数据转换与清洗
⚠️ 注意事项
- LINQ 性能很好,但避免在循环中重复执行未缓存的查询。
- 对数据库使用 LINQ 时,注意生成的 SQL 是否高效(可用 EF 日志查看)。
- 不要过度使用复杂嵌套 LINQ,影响可读性。
✅ 小结
| 特点 | 说明 |
|---|---|
| 统一查询语法 | 一套语法查所有数据源 |
| 强类型 & 编译时检查 | 比字符串 SQL 更安全 |
| 延迟执行 | 高效组合查询 |
| 函数式风格 | 代码简洁、声明式(“要什么”,而不是“怎么做”) |
🧠 一句话记住 LINQ:
“用 C# 写 SQL,查万物。”
问题
使用LINQ有什么好处
他为查询任何类型的数据源提供了通用语法。
什么是LINQ提供程序
他是实现IQueryProvider和Iqueryable接口的任何类。
