虽然在前面的文章里编写了一些LINQ查询,但是没有解释LINQ是如何工作的,现在,我们花点时间来正确的理解它们。
LINQ有多个组成部分,有些是必须的,而有些是可选的。
- 扩展方法:包括Where、Select、OrderBy 等。这些扩展方法使得对集合和数据源进行查询操作变得更加直观和易于理解。
- 表达式:在 LINQ 中,表达式通常指 Lambda 表达式,即匿名函数。Lambda 表达式允许我们在 LINQ 查询中编写条件筛选和投影操作,这为 LINQ 提供了强大的功能。通过 Lambda 表达式,我们可以以一种简洁的方式编写复杂的查询逻辑,并将其嵌入到 LINQ 查询中以实现灵活的数据处理。
- LINQ查询理解语句:查询理解语法是 LINQ 提供的另一种编写查询的方式,它类似于 SQL 查询语句的语法风格。使用查询理解语法,开发人员可以更直观地编写 LINQ 查询,使用类似于 SQL 的关键字(如 from、where、select 等)来构建查询。查询理解语法在编写复杂的查询时具有清晰的结构,并且易于阅读和理解。
1.使用Enumerable类扩展序列
使用 Enumerable 类可以对序列(IEnumerable 接口的实现类)进行各种扩展操作,例如过滤、映射、排序等。
扩展方法 | 说明 |
---|---|
Where | 根据指定条件过滤序列中的元素。 |
Select | 对序列中的每个元素应用转换函数,返回包含结果的新序列。 |
SelectMany | 对序列中的每个元素应用转换函数,并将结果序列扁平化为单个序列。 |
Take | 从序列的开头返回指定数量的元素。 |
Skip | 跳过序列的指定数量的元素,然后返回剩余的元素。 |
OrderBy | 按升序对序列中的元素进行排序。 |
OrderByDescending | 按降序对序列中的元素进行排序。 |
Concat | 连接两个序列。 |
Distinct | 返回一个去除了重复元素的序列。 |
Union | 返回两个序列的并集(去除重复元素)。 |
Intersect | 返回两个序列的交集。 |
Except | 返回存在于第一个序列中但不存在于第二个序列中的元素。 |
Any | 确定序列是否包含任何元素或满足特定条件的元素。 |
All | 确定序列中的所有元素是否都满足指定条件。 |
Count | 返回序列中的元素数量。 |
Sum | 计算序列中数值元素的和。 |
Min | 返回序列中的最小值。 |
Max | 返回序列中的最大值。 |
Average | 计算序列中数值元素的平均值。 |
First | 返回序列中的第一个元素。 |
FirstOrDefault | 返回序列中的第一个元素,如果序列为空则返回默认值。 |
Last | 返回序列中的最后一个元素。 |
LastOrDefault | 返回序列中的最后一个元素,如果序列为空则返回默认值。 |
Single | 返回仅有一个元素的序列中的元素,如果序列为空或包含多个元素则引发异常。 |
SingleOrDefault | 返回仅有一个元素的序列中的元素,如果序列为空则返回默认值,如果包含多个元素则引发异常。 |
ElementAt | 返回序列中指定索引处的元素。 |
ElementAtOrDefault | 返回序列中指定索引处的元素,如果索引超出范围则返回默认值。 |
以上是 Enumerable 类定义的一些常用扩展方法,它们提供了对序列进行筛选、投影、排序以及聚合等多种操作。这些方法可以帮助开发人员更便捷地处理集合数据,使得对数据的操作变得更加灵活和高效。
2.使用Where扩展方法过滤实体
通过使用 Where 扩展方法,我们可以便捷地对实体集合进行条件筛选,从而得到符合特定条件的子集。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<Person> people = new List<Person>
{
new Person {
Name = "Alice", Age = 25 },
new Person {
Name = "Bob", Age =