在C#中使用Linq

在C#中使用Linq

  • 前言
  • 一、基本查询操作
  • 二、高级查询操作
  • 三、数据库查询
  • 四、文件和 XML 查询
  • 五、总结


前言

LINQ(Language Integrated Query)是 C# 中一种强大的查询语言集成特性,它使得在编程语言级别对数据进行查询和操作变得更加简单和直观。通过 LINQ,开发人员可以使用类似 SQL 的语法来对各种数据源进行查询,包括集合、数据库、XML 等,从而提高代码的可读性、减少编写代码的工作量,并且更容易理解和维护。本文将全面介绍 LINQ 的各种用法和优势。


一、基本查询操作

查询表达式
LINQ 查询表达式是一种特殊的语法,使得数据查询操作更加直观和易读。下面是一个简单的 LINQ 查询表达式的示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };
var evenNumbers = from num in numberswhere num % 2 == 0select num;foreach (var num in evenNumbers)
{Console.WriteLine(num); // 输出:2 4
}

在上面的示例中,我们使用 from 关键字定义查询范围,使用 where 关键字添加条件,使用 select 关键字选择需要的结果。

标准查询运算符
标准查询运算符是 LINQ 查询的核心,它包括了一系列用于查询和操作数据的方法。下面是一些常用的标准查询运算符及其示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };// Where 运算符:筛选出符合条件的元素
var evenNumbers = numbers.Where(num => num % 2 == 0);// Select 运算符:将元素投影到新的形式
var squares = numbers.Select(num => num * num);// OrderBy 运算符:按照指定的条件对元素进行排序
var sortedNumbers = numbers.OrderBy(num => num);// GroupBy 运算符:根据指定的条件对元素进行分组
var groups = numbers.GroupBy(num => num % 2 == 0 ? "Even" : "Odd");

以上代码演示了如何使用 LINQ 的常用标准查询运算符对数据进行操作。

二、高级查询操作

延迟执行与立即执行
LINQ 查询具有延迟执行和立即执行的特性。延迟执行意味着查询表达式不会立即执行,直到需要获取结果时才会执行。立即执行则是指查询表达式在定义时立即执行。下面是延迟执行和立即执行的示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };var query = numbers.Where(num => num % 2 == 0); // 这里只是定义查询,并不会立即执行// 延迟执行
foreach (var num in query)
{Console.WriteLine(num); // 输出:2 4
}// 立即执行
var result = query.ToList(); // 查询结果在这里立即执行

复合查询
复合查询是指将多个查询组合在一起,实现复杂的查询操作。可以通过链式调用或嵌套查询来实现复合查询。下面是一个复合查询的示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };var query = numbers.Where(num => num % 2 == 0).OrderByDescending(num => num).Select(num => num * num);foreach (var num in query)
{Console.WriteLine(num); // 输出:16 4
}

在上面的示例中,我们首先筛选出偶数,然后按照降序排序,并最后计算平方。

LINQ 到对象
LINQ to Objects
LINQ to Objects 是 LINQ 中最基础和常用的一种形式,用于对内存中的对象集合进行查询和操作。下面是一个 LINQ to Objects 的示例:

var persons = new List<Person>
{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Charlie", Age = 35 }
};var query = from person in personswhere person.Age > 30select person.Name;foreach (var name in query)
{Console.WriteLine(name); // 输出:Charlie
}

在上面的示例中,我们使用 LINQ 查询出年龄大于 30 岁的人员的姓名。

三、数据库查询

LINQ to SQL
LINQ to SQL 是一种用于通过 LINQ 查询和操作关系型数据库的技术。通过 LINQ to SQL,可以使用 LINQ 查询语法来执行 SQL 查询并将结果映射到.NET对象中。以下是一个简单的 LINQ to SQL 示例:

using (var dbContext = new MyDbContext())
{var query = from p in dbContext.Productswhere p.Price > 100select p;foreach (var product in query){Console.WriteLine($"{product.Name} - {product.Price}");}
}

在上面的示例中,我们使用 LINQ 查询语法从名为 Products 的数据库表中查询出价格大于 100 的产品。

Entity Framework
Entity Framework 是.NET框架中一个强大的对象关系映射(ORM)框架,它支持 LINQ 查询和操作数据库。以下是一个简单的 Entity Framework 示例:

using (var dbContext = new MyDbContext())
{var query = dbContext.Products.Where(p => p.Price > 100).OrderByDescending(p => p.Price).Select(p => new { p.Name, p.Price });foreach (var product in query){Console.WriteLine($"{product.Name} - {product.Price}");}
}

在上面的示例中,我们使用 Entity Framework 进行查询,并选择产品名称和价格。

四、文件和 XML 查询

LINQ to XML
LINQ to XML 提供了一种方便的方式来查询和操作 XML 数据。以下是一个简单的 LINQ to XML 示例:

XDocument doc = XDocument.Load("books.xml");var query = from book in doc.Descendants("book")where (int)book.Element("price") > 10select new{Title = book.Element("title").Value,Price = (decimal)book.Element("price")};foreach (var book in query)
{Console.WriteLine($"{book.Title} - {book.Price}");
}

在上面的示例中,我们从名为 books.xml 的 XML 文件中查询出价格大于 10 的书籍的标题和价格。

LINQ to DataSet
LINQ to DataSet 使得可以通过 LINQ 查询和操作 DataSet 和 DataTable 中的数据。以下是一个简单的 LINQ to DataSet 示例:

DataTable table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Age", typeof(int));table.Rows.Add("Alice", 30);
table.Rows.Add("Bob", 25);
table.Rows.Add("Charlie", 35);var query = from row in table.AsEnumerable()where row.Field<int>("Age") > 30select row.Field<string>("Name");foreach (var name in query)
{Console.WriteLine(name); // 输出:Charlie
}

在上面的示例中,我们从 DataTable 中查询出年龄大于 30 岁的人员的姓名。

五、总结

LINQ 的各种查询操作和用法,包括基本查询操作、高级查询操作、LINQ 到对象、数据库查询、文件和 XML 查询等,提高开发效率和代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725819.shtml

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

相关文章

华为数通方向HCIP-DataCom H12-821题库(多选题:101-120)

第101题 下面关于Network-Summary-LSA描述正确的是 A、Network-Summary-LSA中的Metric被设置成从该ABR到达目的网段的开销值 B、Network-Summary-LSA中 的Netmask被设置成目的网段的网络掩码 C、Network-Summary-LSA中的Link State ID被设置成目的网络的IP地址 D、Network-Sum…

【AI视野·今日Robot 机器人论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 6 Mar 2024 Totally 30 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;SpaceHopper,外星探索多功能三足机器人 (from Robotic Systems Lab, ETH Zurich) Daily Robotics Papers A Safety-Criti…

JavaSE——基础小项目-模拟ATM系统(项目主要目标、技术选型、架构搭建、具体实现、完整代码注释)

目录 项目主要目标 技术选型 面向对象编程 使用集合容器 程序流程控制 使用常见API 系统架构搭建与欢迎页设计 Account ATM Test 用户开户功能实现 录入账户名称与性别 录入账户密码与取现额度 生成新卡号 存入账户 登录功能实现 登录后操作实现 退出账户 存…

每日学习总结20240306

每日总结 20240306 1. 断言测试判断 #include <iostream> #include <assert.h> #include <cassert> #include <stdio.h>#define STR_OK "[\x1b[1;32m OK \x1b[0m]" #define STR_FAIL "[\x1b[1;31mFAIL\x1b[0m]"…

枚举类型绑定ComboBox

1、定义枚举 public enum OrderStatus {None, New, Processing, Shipped, Received }; 2、xaml中的资源中定义ObjectDataProvider <!--GetValues获取所有的值&#xff0c;ObjectType指定枚举的类型--> <ObjectDataProviderx:Key"myEnum"MethodName"G…

Open3D 生成空间3D椭圆点云

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 设椭圆在 X O Y XOY XO

vue3+ts项目创建 使用npm create vue@latest

npm create vuelatest相关创建代码&#xff1a;

短视频矩阵系统技术开发商--支持技术资质核验(自研独立saas框架开发)

短视频矩阵系统是一种能够帮助用户快速制作、发布和推广短视频的系统。 &#x1f347;&#x1f347;它通常包括以下部分&#xff1a; 短视频矩阵系统#短视频矩阵系统源头#短视频矩阵系统源头开发#短视频矩阵系统软件#短视频矩阵系统技术#2024互联网风口项目短视频矩阵系统带动…

【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …

贪心 Leetcode 968 监控二叉树

监控二叉树 Leetcode 968 学习记录自代码随想录 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 要点&#xff1a;1.想到优先覆盖叶子节点&#xff0c…

css-通用样式按钮加号

1.实现 2.代码 html <div class"addF">&#xff0b;</div> css .addF{width:40px;font-size:25px;font-weight:600;background-color:rgb(64, 158, 255);text-align:center;color:white;height:34px;border-radius:3px;line-height:34px; }

【漏洞复现】-用友CRM系统存在逻辑漏洞直接登录后台

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;…

航天民芯一级代理 MT3608 MT3608L 升压转换器 1.2MHZ

MT3608/MT3608L是恒定频率的6引脚SOT23电流模式升压转换器&#xff0c;适用于小型、低功耗应用。MT3608在1.2MHz&#xff0c;允许使用微小、低成本的频率高度不超过2mm的电容器和电感器。内部软启动可实现较小的浪涌电流和延长电池寿命。MT3608具有自动切换到脉冲的功能轻负载下…

Echarts 配置项 series 中的 data 是多维度

文章目录 需求分析 需求 如下图数据格式所示&#xff0c;现要求按照该格式进行绘制折线图 分析 在绘制折线图时&#xff0c;通常我们的 series 中的 data 数据是这样的格式 option {title: {text: Stacked Area Chart},tooltip: {trigger: axis,axisPointer: {type: cross…

C语言大小写字母互换

C语言中大小写字母的互换可以使用ASCII码进行操作。ASCII码中&#xff0c;大写字母的范围是65到90&#xff0c;小写字母的范围是97到122。可以通过判断字符的ASCII码来进行大小写字母的互换。 以下是一个示例代码&#xff1a; #include <stdio.h>int main() {char ch;p…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述&#xff0c;正常使用echarts&#xff0c;H5正常&#xff0c;小程序报错 报错信息如下 解决方案&#xff1a; 注意要点一&#xff1a;vue3需要使用esm文件 地址&#x…

TOMCAT多实例及调优

一、JVM相关理论 &#xff08;一&#xff09;JVM组成 1.JVM组成部分 类加载子系统: 使用Java语言编写.java Source Code文件&#xff0c;通过javac编译成.class Byte Code文件。class loader类加载器将所需所有类加载到内存&#xff0c;必要时将类实例化成实例 运行时数据区…

streamlit学习-如何播放HLS视频(streamlit嵌入html)

streamlit学习-如何播放HLS视频 一.效果二.直播环境搭建(仅供演示)1.生成m3u82.搭建http服务器(支持跨域)3.验证hls(VLC播放 http://localhost:8000/playlist.m3u8) 三.streamlit demo 本文演示了streamlit如何实现hls直播[streamlit中嵌入html] 一.效果 二.直播环境搭建(仅供演…

java 校验框架 - Bean Validation

目录 0. 引言1. 什么是 Bean Validation2. 验证注解3. Bean Validation 的实现4. 快速实战5. 总结 0. 引言 我们在写一些业务逻辑&#xff0c;经常需要写一些业务合法性校验&#xff0c;而这些校验是否可能是共用或者通用性的&#xff0c;那有没有想过有什么好的使用方式&#…

ipv6一致性测试-icmpv6测试步骤

ICMPv6测试步骤 测试配置 防火墙接口1地址 2017:28::6/64 防火墙接口1的MAC地址 00:0C:29:D9:AD:9E 测试主机1地址 2017:28::5/64 测试主机1的网关 2017:28::6 防火墙接口2地址 2017:29::5/64 防火墙接口2的MAC地址 00:0C:29:D9:AD:A8 测试主机2地址 2017:29::5/64 测试主机2的…