一、什么是 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语法,可读性更好。查询语句最终会被转换为查询方法。
例如有:
cs
查询表达式语法(类似于 SQL)
var result = from element in collection
where condition
orderby element.Property ascending/descending
select element;
cs
方法链语法(扩展方法)
var result = collection
.Where(element => condition)
.OrderBy(element => element.Property)
.Select(element => element);
四、LINQ 常见用法示例
(一) 筛选数据(Where)
cs
List<int> numbers = new List<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//查询所有偶数
var evenNumbers = from num int numbers
where num%2 == 0
select num;
//方法链式
var evenNumbers = numbers.Where(num => num%2 == 0);
(二) 投影数据(Select)
cs
List<string> names = new List<string> { "Alice", "Bob", "Charlie" };
// 将每个名字转换为大写
var upperNames = from name in names
select name.ToUpper();
// 方法链形式
var upperNamesMethod = names.Select(name => name.ToUpper());
// 输出:ALICE, BOB, CHARLIE
(三) 排序数据(OrderBy/OrderByDescending)
cs
List<int> numbers = new List<int> { 5, 3, 8, 1, 2 };
// 按升序排序
var sortedNumbers = from num in numbers
orderby num ascending // 可省略 ascending
select num;
// 方法链形式
var sortedNumbersMethod = numbers.OrderBy(num => num);
// 输出:1, 2, 3, 5, 8
(四) 分组数据(GroupBy)
cs
List<string> words = new List<string> { "apple", "banana", "avocado", "cherry" };
// 按首字母分组
var groups = from word in words
group word by word[0] into g
select 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)
cs
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 people
join a in addresses on p.Id equals a.PersonId
select 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 文档等。