掌握 C# 中的 LINQ(语言集成查询)

news/2024/10/4 22:47:41/

LINQ(Language Integrated Query,语言集成查询)是 C# 中的一项强大功能,它使得我们能够使用查询语法处理不同的数据源,如对象、XML、数据库等。LINQ 通过提供统一的查询语法,使开发者能够更加简洁、高效地操作集合和数据结构。本文将介绍 LINQ 的基础知识、查询与方法语法,以及 LINQ to Objects、LINQ to XML 和 LINQ to SQL/Entity Framework 的应用。


1. LINQ 基础

LINQ 是 C# 中内置的一套查询工具,它允许开发者以类似 SQL 的方式查询和处理数据。无论是内存中的对象集合,还是数据库、XML 文档等,LINQ 都能轻松处理。

LINQ 主要包含以下几个核心功能:

  • 统一的查询语法:通过 LINQ,你可以使用类似 SQL 的查询语法来操作各种数据源。
  • 延迟执行:LINQ 查询默认是延迟执行的,查询只有在访问结果时才真正执行。
  • 类型安全:LINQ 在编译时提供类型检查,避免了运行时的类型错误。

例如,以下代码演示了如何使用 LINQ 查询一个整数数组中的偶数:

int[] numbers = { 1, 2, 3, 4, 5, 6 };// 使用 LINQ 查询偶数
var evenNumbers = from num in numberswhere num % 2 == 0select num;foreach (var num in evenNumbers)
{Console.WriteLine(num);  // 输出:2, 4, 6
}

2. LINQ 查询语法和方法语法

LINQ 提供了两种常见的语法:查询语法 和 方法语法

查询语法

查询语法类似于 SQL,通常被认为更直观,尤其是对于简单的查询操作。常用的关键字包括 fromwhereselectorderby 等。

string[] names = { "Alice", "Bob", "Charlie" };// 使用查询语法筛选名字长度大于 3 的元素
var longNames = from name in nameswhere name.Length > 3select name;foreach (var name in longNames)
{Console.WriteLine(name);  // 输出:Alice, Charlie
}

方法语法

方法语法使用扩展方法进行查询,通常更灵活,适合链式调用。常用方法包括 WhereSelectOrderBy 等。

var longNamesMethod = names.Where(name => name.Length > 3);foreach (var name in longNamesMethod)
{Console.WriteLine(name);  // 输出:Alice, Charlie
}

两种语法在功能上是等价的,可以根据个人喜好和代码的复杂程度进行选择。


3. LINQ to Objects

LINQ to Objects 是 LINQ 查询应用于内存中的对象集合(如数组、列表等)的一种形式。它提供了一种非常简洁的方式来操作集合,并且可以与 C# 中的泛型集合 List<T>Array 等一起使用。

List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };// 使用 LINQ to Objects 查询大于 25 的数
var largeNumbers = numbers.Where(n => n > 25);foreach (var num in largeNumbers)
{Console.WriteLine(num);  // 输出:30, 40, 50
}

LINQ to Objects 是日常开发中使用最多的 LINQ 形式,适用于处理程序中各种内存集合的数据。


4. LINQ to XML

LINQ to XML 是 LINQ 查询用于操作 XML 文档的一种形式,它提供了简单且高效的方式来创建、查询、修改和操作 XML 数据。

创建和查询 XML

通过 LINQ to XML,可以轻松创建和查询 XML 结构:

XDocument xmlDoc = new XDocument(new XElement("Books",new XElement("Book", new XAttribute("Title", "C# in Depth"), new XAttribute("Author", "Jon Skeet")),new XElement("Book", new XAttribute("Title", "Pro LINQ"), new XAttribute("Author", "Joe Rattz")))
);// 查询 XML 文档中作者名为 Jon Skeet 的书籍
var booksByJon = from book in xmlDoc.Descendants("Book")where book.Attribute("Author").Value == "Jon Skeet"select book;foreach (var book in booksByJon)
{Console.WriteLine(book.Attribute("Title").Value);  // 输出:C# in Depth
}

修改 XML

你也可以使用 LINQ to XML 修改 XML 文档中的内容。

XElement bookToUpdate = xmlDoc.Descendants("Book").Where(b => b.Attribute("Title").Value == "Pro LINQ").FirstOrDefault();if (bookToUpdate != null)
{bookToUpdate.SetAttributeValue("Title", "LINQ in Action");
}

LINQ to XML 通过友好的 API 提供了对 XML 数据的强大操作能力。


5. LINQ to SQL/Entity Framework

LINQ to SQL 和 Entity Framework 是 LINQ 的数据库相关实现,允许开发者通过 LINQ 查询和操作数据库中的数据。它们将 SQL 查询集成到 C# 代码中,从而提供了高度简化的数据库操作方式。

LINQ to SQL

LINQ to SQL 提供了将数据库表映射为 C# 类的功能。通过创建数据上下文,可以直接对数据库表进行查询和操作:

// 假设我们有一个数据库上下文 'DataContext' 和表 'Customers'
DataContext db = new DataContext("connection_string");var customers = from customer in db.GetTable<Customer>()where customer.City == "New York"select customer;foreach (var customer in customers)
{Console.WriteLine(customer.Name);
}

Entity Framework

Entity Framework 是 Microsoft 提供的 ORM(对象关系映射)工具,它可以更灵活地处理复杂的数据库查询。它支持代码优先(Code First)和数据库优先(Database First)等多种开发模式。

using (var context = new MyDbContext())
{var customers = context.Customers.Where(c => c.City == "New York").ToList();foreach (var customer in customers){Console.WriteLine(customer.Name);}
}

通过 LINQ to SQL 和 Entity Framework,开发者可以非常方便地使用 C# 代码与数据库进行交互,无需编写复杂的 SQL 查询。


结论

LINQ 为 C# 提供了强大而统一的数据查询能力,使得开发者可以轻松地操作内存中的对象、XML 文档以及数据库等数据源。本文介绍了 LINQ 的基础、查询语法、LINQ to Objects、LINQ to XML 以及 LINQ to SQL/Entity Framework 的基本概念和应用。

  • LINQ to Objects 提供了对内存集合的强大查询能力。
  • LINQ to XML 使得操作 XML 数据变得直观简单。
  • LINQ to SQL/Entity Framework 通过对象映射的方式简化了数据库操作。

掌握 LINQ 的这些应用场景,将极大提高你在日常开发中的效率和代码的可读性。如果你对某个部分有进一步的问题或需要深入讨论,欢迎继续交流!


这篇博客涵盖了 LINQ 的基本应用和扩展场景。如果你有任何问题或者需要更多详细的示例,欢迎留言或联系我!


http://www.ppmy.cn/news/1534629.html

相关文章

1G,2G,3G,4G,5G各代通信技术的关键技术,联系和区别

目录 1G2G3G4G5G各代通信技术的联系和区别联系区别 1G 1G的主要特点是无线移动化。关键技术为蜂窝组网&#xff0c;支持频率复用和移动切换&#xff0c;可以实现个人和个人移动状态下不间断的语音通信。 1G通信系统现已关闭&#xff0c;其主要缺点是串好和盗号。 2G 数字化…

Python的file.read方法

Python的file.read方法 file.read() 方法简介file.read() 的工作原理示例&#xff1a;读取整个文件示例&#xff1a;读取指定字符数 文件读取模式使用 read() 处理大文件file.read() 的返回值和 EOFfile.read() 和其他文件读取方法的区别 file.read() 方法简介 file.read() 是…

【接口测试】任务1:登录接口

需要技能竞赛软件测试资料的同学们可s聊我&#xff0c;详细了解 任务实现要求 根据系统管理员—登录—接口API文档&#xff0c;编写接口测试用例&#xff0c;分别使用PostMan及JMeter进行接口测试&#xff0c;需要检查系统接口是否能正常工作&#xff0c;返回值是否正确&#…

WSL (Linux)配置 Rust 开发调试环境

WSL &#xff08;Linux&#xff09;配置 Rust 开发调试环境 安装 Rust&#xff1a;安装 Rust 环境 - Rust语言圣经(Rust Course) 除了执行以上步骤&#xff0c;还得安装编译工具&#xff1a; sudo apt-get update sudo apt-get install build-essential配置 VSCode&#xff1a;…

TypeScript 算法手册 【基数排序】

文章目录 1. 基数排序简介1.1 基数排序定义1.2 基数排序特点 2. 基数排序步骤过程拆解2.1 找出数组中的最大值2.2 从最低位开始&#xff0c;对每一位进行计数排序2.3 对某一位数进行计数排序2.4 将排序结果复制回原数组 3. 基数排序的优化3.1 处理负数3.2 字符串排序案例代码和…

STL之priority_queue篇——深入剖析C++中优先队列的实现原理、核心特性及其底层机制

文章目录 前言一、补充内容&#xff1a;堆1.1 什么是堆1.2 堆的分类与性质1.3 堆的向下调整算法&#xff08;小根堆&#xff09;实现流程&#xff1a;代码&#xff1a; 1.4 堆的向上调整算法&#xff08;小根堆&#xff09;实现流程&#xff1a;代码&#xff1a; 1.5 数组建堆算…

查看 Git 对象存储中的内容

查看 Git 对象存储中的内容 ls -C .git/objects/<dir>ls: 列出目录内容的命令。-C: 以列的形式显示内容。.git/objects/<dir>: .git 是存储仓库信息的 Git 目录&#xff0c;objects 是其中存储对象的子目录。<dir> 是对象存储目录下的一个特定的子目录。 此…

旅游推荐|旅游推荐系统|基于Springboot+VUE的旅游推荐系统设计与实现(源码+数据库+文档)

旅游推荐系统 目录 基于java的旅游推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xf…