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

news2024/10/3 7:21:38

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 numbers
                  where num % 2 == 0
                  select 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 names
                where name.Length > 3
                select 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.coloradmin.cn/o/2185803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某度假村定岗定编项目成功案例纪实

某度假村定岗定编项目成功案例纪实 引入分级定编系统&#xff0c;将个人工资和度假村当日绩效总额挂钩&#xff0c;解决忙闲不均带来的人工成本问题 【客户行业】文旅行业、酒店行业、度假村 【问题类型】定岗定编 【客户背景】 某度假村是一家集住宿、娱乐、健身等服务为…

【Nacos架构 原理】内核设计之Nacos寻址机制

文章目录 前提设计内部实现单机寻址文件寻址地址服务器寻址 前提 对于集群模式&#xff0c;集群内的每个Nacos成员都需要相互通信。因此这就带来一个问题&#xff0c;该以何种方式去管理集群内部的Nacos成员节点信息&#xff0c;即Nacos内部的寻址机制。 设计 要能够感知到节…

MybatisPlus代码生成器的使用

在使用MybatisPlus以后&#xff0c;基础的Mapper、Service、PO代码相对固定&#xff0c;重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用&#xff0c;也很麻烦。 这里推荐大家使…

openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数

文章目录 openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数概述笔记官方给出的单独启动CvPipeLineEditor的方法我自己环境单独启动CvPipeLineEditor的方法CvPipeLineEditor启动后的样子添加命令的方法删除不要的命令参数调整多个命令参数的执行顺序添加命令用来载入实验…

数据治理006-数据标准的管理

元数据的分类和标准有哪些&#xff1f; 一、元数据的分类 元数据可以根据其描述的对象和属性不同&#xff0c;被分为不同的类型。以下是几种常见的元数据分类方法&#xff1a; 基于数据的类型&#xff1a;根据数据的类型&#xff0c;元数据可以被分为结构化元数据、非结构化元…

WPF用户控件的使用

WPF用户控件的使用 先看一下程序结构&#xff1a; WPF_Test是我的主程序&#xff1b;WPF_LIB是我添加的一个用户控件库&#xff0c;其中UserControl1是一个用户控件&#xff1b; 用户控件xaml代码&#xff1a; <UserControl x:Class"WPF_LIB.UserControl1"xmln…

爵士编曲:爵士钢琴编写的规律和步骤 关于教程的个人想法 举一反三

反思了下自己目前学习编曲和其他兴趣爱好时暴露出来的问题&#xff0c;就是举一反三的能力还有待提高&#xff01;平时多学习和多对学习内容进行举一反三&#xff0c;也就是根据一个例子&#xff0c;创作出类似的3个以上的例子&#xff0c;这样才算学会&#xff0c;并且事半功倍…

2024必备英语在线翻译工具推荐

英语在线翻译工具就如同一位随时待命的语言助手&#xff0c;为我们打破语言障碍&#xff0c;搭建起沟通的桥梁。接下来&#xff0c;让我们一起深入了解这些英语在线翻译工具的丰富功能及其为我们带来的便利。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc …

【含文档】基于Springboot+微信小程序 的海产品加工销售一体化管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于SpringBoot+Vue+MySQL的民宿预订平台

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;民宿作为一种独特的住宿方式&#xff0c;受到了越来越多游客的青睐。然而&#xff0c;传统的民宿预定方式往往存在信息不对称、效率低下等问题&#xff0c;难以满足游客的个性化需…

python的内存管理机制

python的内存管理机制主要分为三个部分&#xff1a;引用计数、垃圾回收和内存池机制。 引用计数机制&#xff1a; python通过维护每个对象的引用计数来跟踪内存中的对象。当对象被创建时就会有一个引用计数&#xff0c;当对象不再被使用时&#xff0c;引用计数为0&#xff0c…

Android SystemUI组件(08)睡眠灭屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 睡眠灭屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来完…

【电路基础 · 2】电阻电路的等效变换(自用)

总览 1.电路的等效变换 1.1 电阻电路 1.2 等效变换是什么 1.3 线性电路和非线性电路 1.4 时变电路和非时变电路 1.5 二端网络&#xff08;一端口网络&#xff09;、四端网络&#xff08;二端口网络&#xff09;、六端网络&#xff08;三端口网络&#xff09; 1.6 两端电路的等…

每日一题:二分查找

文章目录 一、思路一&#xff1a;常规思路1、寻找固定值2、寻找左边界3、寻找右边界 二、思路二&#xff1a;红蓝法二分三、模板题1、二分查找2、在排序数组中查找元素的第一个和最后一个位置 二分查找&#xff0c;顾名思义&#xff0c;就是每次筛选能晒掉一半的数据。 二分查…

leetcode每日一题day22(24.10.2)——准时到达的列车最小度

思路&#xff1a;这种在有约束条件情况下&#xff0c;求最值或最符合要求的情况&#xff0c;首先是很容易想到&#xff0c;从时速为1开始往后找找到满足条件就输出&#xff0c;但这无疑工程量很大&#xff0c;每种可能的速度都要对列车数组进行遍历&#xff0c; 时间复杂度为C…

数据库第8章编程题2

10-1 查询选修某两门课程的学生&#xff08;MSSQL) 本题目要求编写SQL语句&#xff0c; 检索出 sc表中至少选修了’C001’与’C002’课程的学生学号。 提示&#xff1a;MSSQLServer 评测SQL语句。 表结构: 请在这里写定义表结构的SQL语句。例如&#xff1a; -- 学生选课成…

Pikachu-Cross-Site Scripting-存储型xss

存储型xss &#xff0c;随便输入点内容&#xff0c;都能保存下来&#xff1b;刷新后也不会丢失&#xff1b;输入特殊字符&#xff0c;也能原样返回&#xff1b; 查看代码&#xff0c;也可以看到输出结果直接原路返回&#xff0c;不做处理 构造payload <script>alert(1)…

深度学习:cGAN和pix2pix图像转换

cGAN和pix2pix的基础概念 cGAN cGAN是条件生成对抗网络&#xff08;Conditional Generative Adversarial Networks&#xff09;的简称。 它是一种基于基础GAN&#xff08;Generative Adversarial Networks&#xff09;架构的变体&#xff0c;通过给GAN模型引入额外的信息或条…

翔云 OCR:发票识别与验真

在数字化时代&#xff0c;高效处理大量文档和数据成为企业和个人的迫切需求。翔云 OCR 作为一款强大的光学字符识别工具&#xff0c;在发票识别及验真方面表现出色&#xff0c;为我们带来了极大的便利。 一、翔云 OCR 简介 翔云 OCR 是一款基于先进的人工智能技术开发的文字识别…

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…