一、什么是 LINQ
LINQ 是一种在 C# 等编程语言中集成的查询功能,它允许开发者使用编程语言本身的语法进行数据查询,而不是嵌入式的字符串 SQL 语句。LINQ 查询可以应用于对象、XML 和数据库等多种数据源。
二、LINQ 查询的基本构成
LINQ 查询通常包含以下几个部分:
- from 子句:指定查询操作的数据源和范围变量;
- select 子句:指定查询结果的形式。
- orderby 子句:对结果进行排序;
- where 子句:筛选符合特定条件的元素;
LINQ 查询表达式包含多种子句,例如有:
- group by子句:对查询结果进行分组;
- Distinct:去除集合中的重复项。
- OrderBy/ThenBy:提供复合排序条件;
- Max/Min/Average/Sum:执行数学运算;
- Count:返回集合中项的数量;
- let 子句:引入范围变量存储子表达式结果;
- join 子句:连接多个数据源;
三、LINQ 查询的两种形式
LINQ 查询有两种不同的语法形式:
- 利用 System.Linq.Enumerable 类中定义的扩展方法和 Lambda 表达式进行查询;
- 类似于SQL语法,可读性更好。查询语句最终会被转换为查询方法。
例如有:
查询表达式语法(类似于 SQL)var result = from element in collectionwhere conditionorderby element.Property ascending/descendingselect element;
方法链语法(扩展方法)var result = collection.Where(element => condition).OrderBy(element => element.Property).Select(element => element);
四、LINQ 常见用法示例
(一) 筛选数据(Where)
List<int> numbers = new List<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//查询所有偶数
var evenNumbers = from num int numberswhere num%2 == 0select num;//方法链式
var evenNumbers = numbers.Where(num => num%2 == 0);
(二) 投影数据(Select)
List<string> names = new List<string> { "Alice", "Bob", "Charlie" };// 将每个名字转换为大写
var upperNames = from name in namesselect name.ToUpper();// 方法链形式
var upperNamesMethod = names.Select(name => name.ToUpper());// 输出:ALICE, BOB, CHARLIE
(三) 排序数据(OrderBy/OrderByDescending)
List<int> numbers = new List<int> { 5, 3, 8, 1, 2 };// 按升序排序
var sortedNumbers = from num in numbersorderby num ascending // 可省略 ascendingselect num;// 方法链形式
var sortedNumbersMethod = numbers.OrderBy(num => num);// 输出:1, 2, 3, 5, 8
(四) 分组数据(GroupBy)
List<string> words = new List<string> { "apple", "banana", "avocado", "cherry" };// 按首字母分组
var groups = from word in wordsgroup word by word[0] into gselect new { Key = g.Key, Words = g };// 方法链形式
var groupsMethod = words.GroupBy(word => word[0]).Select(g => new { Key = g.Key, Words = g });// 输出:
// Group 'a': apple, avocado
// Group 'b': banana
// Group 'c': cherry
(五) 连接操作(Join)
List<Person> people = new List<Person>
{new Person { Id = 1, Name = "Alice" },new Person { Id = 2, Name = "Bob" }
};List<Address> addresses = new List<Address>
{new Address { PersonId = 1, City = "New York" },new Address { PersonId = 2, City = "London" }
};// 内连接:关联人员和地址
var joined = from p in peoplejoin a in addresses on p.Id equals a.PersonIdselect new { Name = p.Name, City = a.City };// 方法链形式
var joinedMethod = people.Join(addresses,p => p.Id,a => a.PersonId,(p, a) => new { Name = p.Name, City = a.City }
);// 输出:
// Alice, New York
// Bob, London
五、LINQ 注意事项
(一) 延迟执行
LINQ 查询通常是延迟执行的,直到你迭代结果(如使用 foreach 或调用 ToList() )才会执行。
(二) 数据源支持
LINQ 可以用于任何实现 IEnumerable<T> 或 IQueryable<T> 的类型,包括集合、数据库上下文(如 Entity Framework)、XML 文档等。