C#:了解LINQ,简化数据查询和操作的强大工具(上)

简介: C#:了解LINQ,简化数据查询和操作的强大工具

linq关键字


以下是 LINQ(Language Integrated Query)中常见的关键字及其作用,并给出一个示例以展示其执行结果:


from

  1. from:用于指定数据源,可以是集合、数组、数据库表等。
    示例:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = from num in numbers
             select num * 2;
// 执行结果:result = { 2, 4, 6, 8, 10 }


where

  1. where:用于筛选满足指定条件的元素。
    示例:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = from num in numbers
             where num % 2 == 0
             select num;
// 执行结果:result = { 2, 4 }


select

  1. select:用于选择返回的结果集。
    示例:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = from num in numbers
             select $"Number: {num}";
// 执行结果:result = { "Number: 1", "Number: 2", "Number: 3", "Number: 4", "Number: 5" }


orderby

  1. orderby:用于对结果集按指定的属性进行排序。
    示例:
var numbers = new List<int> { 3, 1, 4, 2, 5 };
var result = from num in numbers
             orderby num descending
             select num;
// 执行结果:result = { 5, 4, 3, 2, 1 }


join

  1. join:用于在两个数据源之间执行联接操作。
    示例:
var students = new List<Student>
{
    new Student { Id = 1, Name = "Alice" },
    new Student { Id = 2, Name = "Bob" }
};
var scores = new List<Score>
{
    new Score { StudentId = 1, Value = 90 },
    new Score { StudentId = 2, Value = 85 }
};
var result = from student in students
             join score in scores on student.Id equals score.StudentId
             select new { student.Name, score.Value };
// 执行结果:result = { { "Alice", 90 }, { "Bob", 85 } }


group

  1. group:用于按指定的键对结果集进行分组。
    示例:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = from num in numbers
             group num by num % 2 into grouped
             select new { Key = grouped.Key, Numbers = grouped.ToList() };
// 执行结果:result = { { Key = 0, Numbers = { 2, 4 } }, { Key = 1, Numbers = { 1, 3, 5 } } }


let

  1. let:用于在查询过程中定义中间变量。
    示例:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = from num in numbers
             let squared = num * num
             select squared;
// 执行结果:result = { 1, 4, 9, 16, 25 }


into

  1. into:用于将查询结果存储到临时结果集中,以供后续查询操作使用。
    示例:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = from num in numbers
             where num > 2
             select num
             into filtered
             where filtered < 5
             select filtered;
// 执行结果:result = { 3, 4 }


这些关键字是构建 LINQ 查询和操作表达式的重要组成部分。每个关键字都有其特定的用途,可用于执行不同的查询操作。通过组合和嵌套使用这些关键字,可以以声明性的方式构建复杂的查询逻辑。上述示例仅展示了每个关键字的一种常见用法,实际使用时可以根据需求进行灵活组合和定制。


linq方法


在 LINQ(Language Integrated Query)中,提供了许多方法用于查询和操作数据。这些方法可用于对各种数据源(如集合、数组、数据库表等)执行查询、筛选、排序、投影、分组、聚合等操作。以下是一些常见的 LINQ 方法:


筛选方法

Where

  • Where: 根据指定条件筛选元素。

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = numbers.Where(num => num % 2 == 0);
// 执行结果:result = { 2, 4 }


OfType

  • OfType: 筛选指定类型的元素。
var mixedList = new List<object>
{
    1, "Alice", 2, "Bob", 3, "Charlie"
};
var numbers = mixedList.OfType<int>();
// 执行结果:numbers = { 1, 2, 3 }
var names = mixedList.OfType<string>();
// 执行结果:names = { "Alice", "Bob", "Charlie" }

排序方法:


OrderBy

  • OrderBy: 根据指定的键进行升序排序。


OrderByDescending


OrderByDescending: 根据指定的键进行降序排序。

var numbers = new List<int> { 3, 1, 4, 2, 5 };
var ascendingOrder = numbers.OrderBy(num => num);
// 执行结果:ascendingOrder = { 1, 2, 3, 4, 5 }
var descendingOrder = numbers.OrderByDescending(num => num);
// 执行结果:descendingOrder = { 5, 4, 3, 2, 1 }


ThenBy

  • ThenBy: 在已排序的结果集上根据额外的键进行升序排序。

ThenBy 方法用于在已经进行排序的结果集上根据额外的键进行升序排序。它通常与 OrderBy 或 OrderByDescending 方法一起使用。以下是 ThenBy 方法的使用示例:

var students = new List<Student>
{
    new Student { Name = "Alice", Grade = "A", Age = 20 },
    new Student { Name = "Bob", Grade = "B", Age = 22 },
    new Student { Name = "Charlie", Grade = "A", Age = 21 },
    new Student { Name = "David", Grade = "B", Age = 20 }
};
var sortedStudents = students.OrderBy(student => student.Grade)
                             .ThenBy(student => student.Age);


经过 OrderBy 方法根据成绩进行升序排序后,students 列表将变为:

Student { Name = "Alice", Grade = "A", Age = 20 }
Student { Name = "Charlie", Grade = "A", Age = 21 }
Student { Name = "Bob", Grade = "B", Age = 22 }
Student { Name = "David", Grade = "B", Age = 20 }


然后,应用 ThenBy 方法在已排序的结果上根据年龄进行升序排序,最终的排序结果为:

Student { Name = "Alice", Grade = "A", Age = 20 }
Student { Name = "David", Grade = "B", Age = 20 }
Student { Name = "Charlie", Grade = "A", Age = 21 }
Student { Name = "Bob", Grade = "B", Age = 22 }


在上述示例中,我们有一个学生列表 students,每个学生都有姓名、成绩和年龄属性。我们首先使用 OrderBy 方法根据学生的成绩进行升序排序,然后使用 ThenBy 方法在已排序的结果上根据学生的年龄进行升序排序。


执行结果 sortedStudents 是一个按成绩和年龄排序的学生列表。如果学生有相同的成绩,那么他们将按照年龄进行排序。


注意,ThenBy 方法必须在 OrderBy 或 OrderByDescending 方法之后使用,以确保正确的排序顺序。


这个示例展示了如何使用 ThenBy 方法在已排序的结果上进行进一步的排序操作,以满足复合排序的需求。


ThenByDescending

  • ThenByDescending: 在已排序的结果集上根据额外的键进行降序排序。

相关文章
|
2月前
|
自然语言处理 C# Windows
C#开源免费的Windows右键菜单管理工具
C#开源免费的Windows右键菜单管理工具
|
3月前
|
SQL 开发框架 .NET
C#进阶-LINQ实现对集合的增删改查
本篇演示了LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
38 0
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---where和select用法(二)
C#学习相关系列之Linq用法---where和select用法(二)
|
4月前
|
XML 开发框架 .NET
C# | Linq基本功 —— 必学的必熟的10个方法
Linq(Language Integrated Query)是C#语言中的一种查询语言,它提供了一种统一的方式来查询和操作各种数据源,如集合、数据库、XML等。Linq的出现使得开发者能够以一种更简洁、更直观的方式来处理数据,提高了代码的可读性和可维护性。
80 0
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---group和join相关用法(三)
C#学习相关系列之Linq用法---group和join相关用法(三)
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq常用方法---排序(一)
C#学习相关系列之Linq常用方法---排序(一)
|
5月前
|
缓存 开发框架 监控
一个C#开发的开源的快速启动工具
一个C#开发的开源的快速启动工具
43 0
|
1月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
158 2
|
2月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
10 0
|
3月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。