C#的LINQ全称是语言集成查询,是C# 3.0及之后版本引入的核心特性,它把查询能力直接集成到C#编程语言中,让开发者可以用类似SQL的语法对不同类型的数据源进行查询操作,不需要为不同数据源学习不同的查询语法。

LINQ的核心概念
LINQ的本质是一组扩展方法,主要基于IEnumerable<T>接口实现,所以只要实现了该接口的数据源都可以使用LINQ操作。它的核心优势主要体现在三个方面:
- 语法统一:不管是操作内存中的集合、数据库表还是XML文档,都可以用相同的查询语法,降低学习成本
- 类型安全:查询过程中会进行编译时类型检查,减少运行时错误
- 延迟执行:大部分LINQ查询不会立即执行,只有在遍历结果时才会真正执行查询逻辑,提升性能
LINQ的两种使用语法
LINQ提供了两种常用的语法形式,分别是查询语法和方法语法,两者功能等价,开发者可以根据习惯选择使用。
1. 查询语法
查询语法类似SQL的写法,可读性更强,适合简单的查询场景。基本结构是从数据源中获取数据,设置筛选条件,最后选择需要的字段。
下面是一个从整数集合中筛选偶数的示例:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
// 定义数据源
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// LINQ查询语法:筛选偶数
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
// 遍历输出结果
Console.WriteLine("筛选出的偶数:");
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
}
}
2. 方法语法
方法语法是通过调用LINQ的扩展方法实现查询,适合复杂逻辑的场景,很多时候比查询语法更灵活。上面的筛选偶数示例用方法语法可以写成如下形式:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// LINQ方法语法:筛选偶数,使用Lambda表达式作为条件
var evenNumbers = numbers.Where(num => num % 2 == 0);
Console.WriteLine("筛选出的偶数:");
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
}
}
常见LINQ操作示例
排序操作
使用OrderBy和OrderByDescending可以对结果进行排序,下面的示例对学生列表按年龄升序排序:
using System;
using System.Collections.Generic;
using System.Linq;
class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
List<Student> students = new List<Student>
{
new Student { Name = "张三", Age = 20 },
new Student { Name = "李四", Age = 18 },
new Student { Name = "王五", Age = 22 }
};
// 按年龄升序排序
var sortedStudents = students.OrderBy(s => s.Age);
Console.WriteLine("按年龄升序排序后的学生:");
foreach (var student in sortedStudents)
{
Console.WriteLine($"姓名:{student.Name},年龄:{student.Age}");
}
}
}
投影操作
使用Select可以对查询结果进行投影,转换数据的形状,比如只获取学生的姓名:
using System;
using System.Collections.Generic;
using System.Linq;
class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
List<Student> students = new List<Student>
{
new Student { Name = "张三", Age = 20 },
new Student { Name = "李四", Age = 18 }
};
// 投影操作:只获取学生姓名
var studentNames = students.Select(s => s.Name);
Console.WriteLine("所有学生姓名:");
foreach (var name in studentNames)
{
Console.WriteLine(name);
}
}
}
使用注意事项
- 延迟执行特性:如果查询之后数据源发生了变化,再次遍历查询结果时会得到最新的数据,不需要重新执行查询
- 立即执行:如果需要立即获取查询结果,可以调用
ToList、ToArray等方法,把结果转换为集合,避免后续数据源变化影响结果 - 空值处理:如果数据源可能为null,需要先做非空判断,否则调用LINQ方法会抛出空引用异常
LINQC#IEnumerableLambda_表达式修改时间:2026-07-14 08:03:10