在 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 numbers
             where num > 5
             orderby num descending
             select 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);
}

💡 好处:可以链式组合多个操作,最终只执行一次高效查询(尤其对数据库)。


✅ 实际应用场景

  1. 过滤 UI 列表数据
    var filtered = allProducts.Where(p => p.Price < 100).ToList();
    
  2. 从 API 返回的数据中提取所需字段
  3. 配合 Entity Framework 查询数据库
    var users = dbContext.Users
                         .Where(u => u.IsActive)
                         .Select(u => u.Email)
                         .ToList();
    
  4. 数据转换与清洗

⚠️ 注意事项

  • LINQ 性能很好,但避免在循环中重复执行未缓存的查询
  • 对数据库使用 LINQ 时,注意生成的 SQL 是否高效(可用 EF 日志查看)。
  • 不要过度使用复杂嵌套 LINQ,影响可读性。

✅ 小结

特点 说明
统一查询语法 一套语法查所有数据源
强类型 & 编译时检查 比字符串 SQL 更安全
延迟执行 高效组合查询
函数式风格 代码简洁、声明式(“要什么”,而不是“怎么做”)

🧠 一句话记住 LINQ
“用 C# 写 SQL,查万物。”

问题

使用LINQ有什么好处

他为查询任何类型的数据源提供了通用语法。

什么是LINQ提供程序

他是实现IQueryProvider和Iqueryable接口的任何类。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐