C#—LINQ详解及汇总

LINQ详解及汇总

LINQ(Language Integrated Query)是微软的一项技术,允许开发者以一种简洁的方式查询和操作数据,支持多种数据源,包括对象、数据库、XML和数据集。LINQ定义了约40个查询操作符,如select、from、in、where以及order by等,这些操作符可以编写查询语句,处理各种类型的数据‌。

LINQ可以用最少的代码对数据源执行复杂的筛选、排序和分组操作。使用相同的基本查询表达式模式来查询和转换 SQL数据库、ADO.NET数据集、XML文档和流以及,NET集合中的数据。

查询表达式必须以from 子句开头,并且必须以select或group 子句结尾。在第一个 from 子
句和最后一个select或group 子句之间,查询表达式可以包含一个或多个下列可选子句。LINQ查询代码中关键字必须小写。

LINQ的不同实现形式及其现状:
  1. LINQ to Objects‌:用于操作内存中的对象集合。
  2. ‌LINQ to SQL‌:用于查询数据库。然而,LINQ to SQL已经停止维护,被Entity Framework(EF)取代‌。
  3. ‌LINQ to Datasets‌:用于操作数据集。
  4. ‌LINQ to Entities‌:用于查询实体框架中的数据。
  5. ‌LINQ to XML/XSD‌:用于操作XML数据。
  6. ‌LINQ to Data Source‌:用于查询数据源。

基本步骤

  • 创建数据模型:使用 LINQ to SQL 工具自动生成或手动创建与数据库表对应的 C# 类。
  • 执行查询:使用 LINQ 查询语法来检索、更新、插入或删除数据。
  • 提交更改:将对数据所做的更改同步回数据库。

LINQ数据源

  • 应用程序始终将源数据视为一个lEnumerable<T>或IQueryable<T>集合。在 LINQtoXML中,源数据显示为一个IEnumerable<XElement>。
  • 在 LINQto DataSet中,它是一个IEnumerable<DataRow>。在 LINQ toSQL中,它是定义用来表示SQL表中数据的任何自定义对象的lEnumerable 或lQueryable。
  • (‌IEnumerable<T> 或 IQueryable<T>‌:这是大多数LINQ查询的返回值类型。它们表示一个序列,可以包含零个、一个或多个元素。)

LINQ组成部分(大概):

  • IEnumerable<T> 枚举器  (详解: C#—内建接口: IEnumerable与IEnumerator接口详解-CSDN博客)
  • 扩展方法 :  (详解:  C#—扩展方法-CSDN博客)
  • IQueryable<T> (它实现了IEnumerable) (详解: C#—内建接口: IQueryable接口详解-CSDN博客)
  • lambda表达式  :(详解: C#之lambda表达式_c# array.exists-CSDN博客)

LINQ语法:

一、select 查询

// 扩展方法 Select
var query = studentsList.Select(s => new { id = s.Id, age = s.Age > 20 ? 20 : 0 });  // new { id = s.Id, age20 } // 匿名实例
// 表达式用法 Select
var query2 = from s in studentsList select new { id = s.Id, age = s.Age > 20 ? 20 : 0 };

二、where筛选条件

// 扩展方法形式 Where
List<Students> list2 = studentsList.Where(x=>x.Age<20).ToList();
// 表达式形式 Where
List<Students> val = (from s2 in list2 where s2.Id == 2 || s2.Id < 3 select s2).ToList();

三、let临时变量

/// let 创建变量
int[] ints = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
var query11 = from s in intslet n = s % 2where n == 0select s;

四、Orderby排序

// 排序
var query7 = studentsList.OrderBy(s => s.Name); // OrderBy 升序
var query8 = studentsList.OrderByDescending(s => s.Id); // OrderByDescending 倒序
var query77 = from s in studentsList orderby s.Id ascending select s; // ascending升序
var query777 = from s in studentsList orderby s.Id descending select s; // descending倒序

五、分页查询Skip、Take、Top

  • Skip:跳过前几条数据
  • Take:获取指定数量元素
  • Top:截取前几条数据
/* 表达式 */
List<string> nameList = (from u in list select u.name).Skip(3).Take(3).ToList();
/* 扩展方法 */
List<string> nameList = list.Skip(3).Take(3).Select(x => x.name).ToList();

六、分组查询 Group By

  • 1、Group字句把select的对象根据一些标准进行分组。
  • 2、从查询表达式返回的对象是从查询中枚举分组结果的可枚举类型。
  • 3、每一个分组由一个叫做键的字段区分。
  • 4、每一个分组本身是可枚举类型并可以枚举它的项。
/* 扩展方法 */
IEnumerable<IGrouping<string, User>> UserGroupByOccupation = list.GroupBy(s => s.occupation);
/* 表达式 */
IEnumerable<IGrouping<string, User>> UserGroupByOccupation= from u in listgroup u by u.occupation into n

结果:

/* 遍历 输出 */
foreach(IGrouping<string, User> u in UserGroupByOccupation)
{Console.WriteLine(u.Key);foreach (User user in u){Console.WriteLine(PrintUserObject(user));}
}/* 输出结果 */
Teacher
{id = 1, name = Zhang Long, age = 38, gender = True, occupation = Teacher}
{id = 3, name = Zhang Shuai, age = 38, gender = False, occupation = Teacher}
Student
{id = 2, name = Zhang Jin, age = 18, gender = False, occupation = Student}
{id = 9, name = Hu Ziming, age = 21, gender = True, occupation = Student}
{id = 10, name = Hu Jin, age = 21, gender = False, occupation = Student}
Doctor
{id = 4, name = Liu Guangzhi, age = 38, gender = False, occupation = Doctor}
{id = 5, name = Liu Ziming, age = 38, gender = True, occupation = Doctor}
{id = 6, name = Liu Shuai, age = 29, gender = False, occupation = Doctor}
Builder
{id = 7, name = Liu Jin, age = 21, gender = True, occupation = Builder}
{id = 8, name = Jiang Long, age = 38, gender = True, occupation = Builder}

七、多表查询Join

SQL中常见的连接查询有:

  • left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
  • right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
  • inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
  • full join : 外连接,返回两个表中的行:left join + right join。
  • cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

Linq只有Join这个函数。

  • Linq中的Join连接查询是通过调换关联表和被关联表的顺序来转换左右连接的方向,通过调整Where和On等条件筛选函数的位置,来改变逻辑,实现更复杂的内连接全连接等功能。
// Join
// 表达式  (equals 同等)
var query3 = from s in studentsList join c in classList on s.ClassId equals c.Id select new {Id = s.Id,ClassId = s.ClassId,Name = s.Name,Age = s.Age,ClassName = c.ClassName };
// 扩展方法
var query4 = studentsList.Join(classList,s=>s.ClassId,c=>c.Id,(s,c)=>new { Id = s.Id, ClassId = s.ClassId, Name = s.Name, Age = s.Age, ClassName = c.ClassName });

八、聚合函数Count、Average、Max、Min、Sum

  • 聚合函数是用于对查询结果进行汇总和计算的特殊函数。它们被用于计算一组行的总和、平均值、最大值、最小值等。在此文章中,将介绍SQL Server中一些常见的聚合函数及其用法。

(1).Count计数

/* 表达式 */
int count = (from u in list where u.occupation == "Teacher" where !u.gender where u.name.StartsWith("Zhang") select u).Count();
/* 扩展方法 */
int count = list.Count(u => u.occupation == "Teacher" && !u.gender && u.name.StartsWith("Zhang"));

(2).Average平均值

/* 表达式 */
double averageNum = (from u in list where u.occupation == "Doctor" where u.age<40 where u.name.StartsWith("Liu") select u.age).Average();
/* 扩展方法 */
double averageNum = list.Where(u => u.occupation == "Doctor" && u.age < 40 && u.name.StartsWith("Liu")).Select(u => u.age).Average();

(3).Max最大值、Min最小值、Sum和

这里仅需参考LINQ求平均值的例子,求最大/小值或者总和时,只需要把C#语句末尾的.Average()方法替换成.Max()/.Min()/.Sum()即可。

九、模糊查询

  • 在C#中,使用LINQ进行模糊查询通常涉及到Where子句中对字符串的比较,可以使用string字符串中的方法来查找包含指定字符串的元素,或者使用正则表达式来实现更复杂的模糊查询。
// 查询名字中带有1的学生
var query9 = studentsList.Where(s => s.Name.Contains("1"));

十、子查询

var ordersWithProduct3 = orders.Where(o => o.OrderDetails.Any(d => d.ProductID == 3));

十一、投影

投影的过程就是把取得的结果进行处理,可以把结果集合内的对象只取其中一个或多个元素组成一个新的集合,生成一个原对象、基本类型、元组或匿名对象的新集合。

/* 表达式 */
List<User> userList = (from u in list where u.occupation == "Doctor" select u).ToList();
/* 扩展方法 */
List<User> userList = list.Where(p => p.occupation == "Doctor").ToList();

十二、集合的增删改查

/* 新增一个任意属性的用户到集合 */
/* C#版本1 */
list.Add(new User() {id = 11,name = "Liu Mingxiu",age = 22,gender = false,occupation = "Doctor"
});/* C#版本2(支持一次添加多个) */
IEnumerable<User> userAddList = new List<User>().Append(userAdd);
list.AddRange(userAddList);

/* 推荐使用RemoveAll方法批量删除 */
/* C#版本1 */
list.RemoveAll(item => item.occupation == "Doctor");/* 也可以使用Remove方法单个删除 */
/* C#版本2 */
List<User> maps = list.Where(item => item.occupation == "Doctor").ToList();
foreach (User userDelete in maps){list.Remove(userDelete);
}/* C#版本3 */
List<User> maps = (from u in list where u.occupation == "Doctor" select u).ToList();
foreach (User userDelete in maps){list.Remove(userDelete);
}

/* C#版本1 使用ForEach方法 */
salaryList.Where(item => item.occupation == "Doctor").ToList().ForEach(u => { u.salary = 10000; u.active = true; });/* C#版本2 使用All方法(需要返回true) */
salaryList.Where(item => item.occupation == "Doctor").ToList().All( u => { u.salary = 10000; u.active = true; return true; });


LINQ查询参考 :  C#进阶-LINQ表达式总结_c# linq-CSDN博客


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

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

相关文章

MySQL用表组织数据

用表组织数据 文章目录 用表组织数据一.四种完整性约束二.数值类型2-1三.数值类型2-2四.字符串.日期类型五.设置1.设置主键2.设置标识列3.设置非空4.设置默认值 六.主外键建立后注意事项 一.四种完整性约束 1.域完整性 列 域完整性约束方法:限制数据类型,检查约束,外键约束,默…

面试经典问题 —— 最大/小前K个数问题(top - K)问题

目录 常见思路更优的解法&#xff08;面试官喜欢的&#xff09; 常见思路 要选出最小的前K个数首先我们会想到排排升序建大堆&#xff0c;排降序建小堆 一个直观的想法是使用&#xff08;小根堆&#xff09;&#xff0c;起始将所有元素放入堆中&#xff0c;然后再从堆中取出k 个…

外包干了27天,技术退步明显。。。。。

时光荏苒&#xff0c;转眼我已是一个拥有近四年功能测试经验的大专生。20年&#xff0c;我满怀激情地通过校招进入湖南某知名软件公司&#xff0c;期待在这里开启我的职业生涯。然而&#xff0c;长时间的舒适环境让我渐渐失去了前进的动力&#xff0c;技术停滞不前&#xff0c;…

从自动驾驶到具身智能漫谈

0. 简介 从作者的眼光来看自动驾驶和具身智能已经是越来越接近了。无论是技术栈以及实现的最终目的。其实都是希望人在环内。这个是古月直播的文字相关的大致梳理。主要会展开聊一聊自动驾驶的变迁以及作为自动驾驶的从业人员要着重关注的一些技术点 1. 自动驾驶的变迁 在自…

Excel粘贴复制不完整的原因以及解决方法

在数据处理和分析的过程中&#xff0c;Excel无疑是不可或缺的工具。然而&#xff0c;在使用Excel进行复制粘贴操作时&#xff0c;有时会遇到粘贴不完整的情况&#xff0c;这可能会让人感到困惑和烦恼。本文将深入探讨Excel粘贴复制不完整的原因、提供解决方案&#xff0c;并给出…

云原生之docker详解

目录 1.云原生概念 1.1 云原生定义 1.2 云原生元素 1.2.1 微服务 1.2.2 DevOps 1.2.3 持续交付 1.2.4 容器化 2. Docker 2.1 Docker概述 2.1.1 Docker 定义 2.1.2 Docker应用场景 2.1.3 Docker的架构 2.2 Docker命令 2.2.1 docker进程相关命令 2.2.2 docker镜像…

数仓开发那些事(8)

程序员圣经 为什么刚刚能运行&#xff0c;现在就不行 为什么刚刚不运行&#xff0c;现在就可以 为什么他的可以跑&#xff0c;我的不能跑 为什么我的可以跑&#xff0c;他的就不行 为什么这台电脑能&#xff0c;那台就不行 为什么这台电脑不行&#xff0c;那台就行 神州员工&a…

在UE5中调用ImGui图形界面库

ImGui是一个小巧灵活、简洁美观的图形界面库 首先我们直接参考Github https://github.com/SLSNe/Unreal5-ImGui 把项目下载下来后 打开项目目录或者引擎目录 项目根目录/Plugins/ImGui/ 或 UE5引擎根目录/Engine/Plugins/ 如果没有Plugins文件夹就新建一个 把项目放里面…

华为管理变革之道:奋斗文化与活力

目录 企业文化是什么&#xff1f; 为什么活下去是华为的文化&#xff1f; 活下来&#xff0c;是华为公司的最低纲领&#xff0c;也是华为公司的最高纲领&#xff01; 资源终会枯竭&#xff0c;唯有文化才能生生不息 企业文化之一&#xff1a;以客户为中心 企业文化之二&a…

JZ31 栈的压入、弹出序列

题目来源&#xff1a;栈的压入、弹出序列_牛客题霸_牛客网 题目&#xff1a;如下 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xf…

(echarts)数据地图散点类型根据条件设置不同的标记图片

(echarts)数据地图散点类型根据条件设置不同的标记图片 1.用在线工具将本地图片转化base64格式 data(){return { base64Img:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQ...",} }在线转换地址&#xff1a;https://www.jyshare.com/front-end/59/ 2.symbol属…

ArcGIS+MIKE21 洪水淹没分析、溃坝分析,洪水淹没动态效果

洪水淹没分析过程&#xff1a; 一、所需数据&#xff1a; 1.分析区域DEM数据 二、ArcGIS软件 1.提取分析区域DEM&#xff08;水库坝下区域&#xff09; 2.DEM栅格转点 3.计算转换后几何点的x和y坐标值&#xff08;精度20、小数位3&#xff09; 4.导出属性表&#xff0c;形式…

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测 目录 LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.LSTM-SVM时序预测 | Matlab基于LSTM…

虚拟机桥接模式网络连接不上解决方法

可能是桥接模式自动配置网络地址的时候没配好&#xff0c;自己手动配置一下。先看看windows里的wifi的ip 把虚拟机的网络设置打开ipv4把地址、子网掩码、网关输进去&#xff0c;然后再连接

家用无线路由器的 2.4GHz 和 5GHz

家中的无线路由器 WiFi 名称有两个&#xff0c;一个后面带有 “5G” 的标记&#xff0c;这让人产生疑问&#xff1a;“连接带‘5G’的 WiFi 是不是速度更快&#xff1f;” 实际上&#xff0c;这里的 “5G” 并不是移动通信中的 5G 网络&#xff0c;而是指路由器的工作频率为 5G…

面试场景题系列:设计一致性哈希系统

为了实现横向扩展&#xff0c;在服务器之间高效和均匀地分配请求/数据是很重要的。一致性哈希是为了达成这个目标而被广泛使用的技术。首先&#xff0c;我们看一下什么是重新哈希问题。 1 重新哈希的问题 如果你有n个缓存服务器&#xff0c;常见的平衡负载的方法是使用如下哈希…

【视觉惯性SLAM:相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容&#xff0c;它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型&#xff0c;以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

物联网网络中的设备认证方法

论文标题&#xff1a;DEVICE AUTHENTICATION METHOD IN INTERNET OF THINGS NETWORKS&#xff08;物联网网络中的设备认证方法&#xff09; 作者信息&#xff1a; A.Ya. Davletova&#xff0c;West Ukrainian National University, 11, Lvivska Str. Ternopil, 46009, Ukraine…

GitLab部署到阿里云服务器上

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。 一、安装 1.创建一…

Linux------进程处理(system库函数)

视频&#xff1a; 【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p34&vd_source342079de7c07f82982956aad8662b467 #include <stdlib.h> #include <…