C Sharp LINQ 基础
C# LINQ基础[编辑 | 编辑源代码]
LINQ(Language Integrated Query,语言集成查询)是C#中的一项强大功能,它允许开发者使用类似SQL的语法直接在代码中查询数据,无论是来自集合、数据库、XML还是其他数据源。LINQ提供了一种统一的方式来查询和操作数据,使得代码更加简洁、可读性更高。
什么是LINQ?[编辑 | 编辑源代码]
LINQ是.NET框架的一部分,它扩展了C#语言,使得查询操作成为语言的一部分,而不再需要依赖外部查询语言(如SQL)。LINQ的主要特点包括:
- 强类型检查:编译器可以在编译时检查查询语法,减少运行时错误。
- 统一的查询语法:无论是查询集合、数据库还是XML,语法基本一致。
- 延迟执行:查询只有在实际需要结果时才会执行,提高性能。
LINQ主要分为以下几类:
- LINQ to Objects:用于查询内存中的集合(如List、Array等)。
- LINQ to SQL:用于查询关系型数据库(如SQL Server)。
- LINQ to XML:用于查询和操作XML文档。
- LINQ to Entities:用于Entity Framework中的查询。
LINQ基础语法[编辑 | 编辑源代码]
LINQ提供了两种查询语法: 1. 查询表达式语法(类似于SQL语法)。 2. 方法语法(使用扩展方法,如`Where`、`Select`等)。
查询表达式语法[编辑 | 编辑源代码]
查询表达式语法使用`from`、`where`、`select`等关键字来构建查询。
// 示例:从一个整数列表中筛选出偶数并排序
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = from num in numbers
where num % 2 == 0
orderby num descending
select num;
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
输出:
10 8 6 4 2
方法语法[编辑 | 编辑源代码]
方法语法使用Lambda表达式和扩展方法(如`Where`、`Select`、`OrderBy`等)来构建查询。
// 同样的示例,使用方法语法
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = numbers
.Where(num => num % 2 == 0)
.OrderByDescending(num => num);
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
输出:
10 8 6 4 2
LINQ常用操作[编辑 | 编辑源代码]
以下是LINQ中常用的操作符及其作用:
操作符 | 描述 | 示例 |
---|---|---|
Where | 过滤数据 | numbers.Where(n => n > 5)
|
Select | 投影数据(转换或提取字段) | numbers.Select(n => n * 2)
|
OrderBy | 升序排序 | numbers.OrderBy(n => n)
|
OrderByDescending | 降序排序 | numbers.OrderByDescending(n => n)
|
GroupBy | 分组数据 | numbers.GroupBy(n => n % 2 == 0 ? "Even" : "Odd")
|
Join | 连接两个数据源 | list1.Join(list2, x => x.Id, y => y.Id, (x, y) => new { x.Name, y.Age })
|
First / FirstOrDefault | 获取第一个元素 | numbers.First(n => n > 5)
|
Any | 检查是否存在符合条件的元素 | numbers.Any(n => n > 5)
|
Count | 计算符合条件的元素数量 | numbers.Count(n => n > 5)
|
实际应用案例[编辑 | 编辑源代码]
案例1:查询学生成绩[编辑 | 编辑源代码]
假设有一个学生列表,每个学生有姓名和成绩属性,我们可以使用LINQ查询成绩优秀的学生。
class Student
{
public string Name { get; set; }
public int Score { get; set; }
}
List<Student> students = new List<Student>
{
new Student { Name = "Alice", Score = 85 },
new Student { Name = "Bob", Score = 72 },
new Student { Name = "Charlie", Score = 90 },
new Student { Name = "David", Score = 65 }
};
// 查询成绩大于80的学生并按成绩降序排列
var topStudents = students
.Where(s => s.Score > 80)
.OrderByDescending(s => s.Score);
foreach (var student in topStudents)
{
Console.WriteLine($"{student.Name}: {student.Score}");
}
输出:
Charlie: 90 Alice: 85
案例2:分组统计[编辑 | 编辑源代码]
使用`GroupBy`对数据进行分组统计。
// 按成绩等级分组(优秀、良好、及格、不及格)
var groupedStudents = students
.GroupBy(s => s.Score >= 90 ? "优秀" :
s.Score >= 80 ? "良好" :
s.Score >= 60 ? "及格" : "不及格");
foreach (var group in groupedStudents)
{
Console.WriteLine($"等级: {group.Key}");
foreach (var student in group)
{
Console.WriteLine($" {student.Name}: {student.Score}");
}
}
输出:
等级: 良好 Alice: 85 等级: 优秀 Charlie: 90 等级: 及格 Bob: 72 等级: 不及格 David: 65
延迟执行与立即执行[编辑 | 编辑源代码]
LINQ查询分为两种执行方式: 1. 延迟执行:查询定义后不会立即执行,只有在遍历结果或调用`ToList()`、`ToArray()`等方法时才会执行。 2. 立即执行:调用聚合函数(如`Count`、`First`、`Average`等)会立即执行查询。
// 延迟执行示例
var query = numbers.Where(n => n > 5); // 查询未执行
Console.WriteLine("查询已定义,但未执行");
foreach (var num in query) // 查询在此处执行
{
Console.WriteLine(num);
}
// 立即执行示例
int count = numbers.Count(n => n > 5); // 查询立即执行
Console.WriteLine($"大于5的数字数量: {count}");
性能优化建议[编辑 | 编辑源代码]
- 尽量使用延迟执行,避免不必要的计算。
- 对于频繁使用的查询结果,可以缓存(如使用`ToList()`或`ToArray()`)。
- 在数据库查询中,尽量使用`Select`只加载需要的字段,避免加载全部数据。
总结[编辑 | 编辑源代码]
LINQ是C#中一个强大的工具,它简化了数据查询和操作,提高了代码的可读性和可维护性。无论是查询内存中的集合还是数据库,LINQ都提供了一致的语法。掌握LINQ的基础操作是成为高效C#开发者的关键一步。
在后续章节中,我们将深入探讨LINQ的高级用法,如连接查询、聚合操作和自定义扩展方法。