跳转到内容

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的高级用法,如连接查询、聚合操作和自定义扩展方法。