C#—LINQ详解及汇总

news2024/12/27 3:26:15

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 ints
              let n = s % 2
              where n == 0
              select 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 list
                   group 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.coloradmin.cn/o/2266146.html

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

相关文章

第十六届“蓝桥杯”全国软件和信息技术专业人才大赛简介及资料大全

蓝桥杯全国软件和信息技术专业人才大赛是由工业和信息化部人才交流中心主办的一项全国性竞赛&#xff0c;面向全国高校大学生&#xff0c;累计参赛院校超过1200余所&#xff0c;参赛人数达40万人&#xff0c;是我国极有影响力的高校IT类赛事。 “第十六届蓝桥杯全国软件和信息…

快速理解24种设计模式

简单工厂模式 建立产品接口类&#xff0c;规定好要实现方法。 建立工厂类&#xff0c;根据传入的参数&#xff0c;实例化所需的类&#xff0c;实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例&#xff0c;并提供一个访问他它的全局…

【山西长治】《长治市市直部门政务信息化建设项目预算编制规范和预算编制标准》(长财行[2022]25号)-省市费用标准解读系列32

《长治市市直部门政务信息化建设项目预算编制规范和预算编制标准(试行)》&#xff08;长财行[2022]25号&#xff09;于2022年8月1日开始试行&#xff0c;此标准由长治市财政局、长治市行政审批管理局编制&#xff0c;是对信息化建设项目预算管理的基本要求&#xff0c;主要适用…

Docker 入门:如何使用 Docker 容器化 AI 项目(二)

四、将 AI 项目容器化&#xff1a;示例实践 - 完整的图像分类与 API 服务 让我们通过一个更完整的 AI 项目示例&#xff0c;展示如何将 AI 项目容器化。我们以一个基于 TensorFlow 的图像分类模型为例&#xff0c;演示如何将训练、推理、以及 API 服务过程容器化。 4.1 创建 …

Java和Go语言的优劣势对比

文章目录 Java和Go语言的优劣势对比一、引言二、设计哲学与语法特性1、设计哲学2、语法特性 三、性能与内存管理1、性能2、内存管理和垃圾回收 四、并发编程模型五、使用示例1、Go语言示例代码2、Java语言示例代码 六、对比表格七、总结 Java和Go语言的优劣势对比 一、引言 在…

Docker怎么关闭容器开机自启,批量好几个容器一起操作?

环境&#xff1a; WSL2 docker v25 问题描述&#xff1a; Docker怎么关闭容器开机自启&#xff0c;批量好几个容器一起操作&#xff1f; 解决方案&#xff1a; 在 Docker 中&#xff0c;您可以使用多种方法来关闭容器并配置它们是否在系统启动时自动启动。以下是具体步骤和…

Pytorch | 利用BIM/I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用BIM/I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集BIM介绍基本原理算法流程 BIM代码实现BIM算法实现攻击效果 代码汇总bim.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Py…

网狐旗舰版源码搭建概览

简单的列一下&#xff1a; 服务端源码内核源码移动端源码核心移动端源码AI控制工具源码多款子游戏源码前端、管理后台、代理网站源码数据库自建脚本UI工程源码配置工具及二次开发帮助文档 编译环境要求 VS2015 和 Cocos3.10 环境&#xff0c;支持移动端 Android 一键编译&am…

【QT】:QT(介绍、下载安装、认识 QT Creator)

背景 &#x1f680; 在我们的互联网中的核心岗位主要有以下几种 开发&#xff08;程序员&#xff09;测试运维&#xff08;管理机器&#xff09;产品经理&#xff08;非技术岗位&#xff0c;提出需求&#xff09; 而我们这里主要关注的是开发方向&#xff0c;开发岗位又分很…

MySQL 数据”丢失”事件之 binlog 解析应用

事件背景 客户反馈在晚间数据跑批后,查询相关表的数据时,发现该表的部分数据在数据库中不存在 从应用跑批的日志来看,跑批未报错,且可查到日志中明确显示当时那批数据已插入到数据库中 需要帮忙分析这批数据丢失的原因。 备注:考虑信息敏感性,以下分析场景测试环境模拟,相关数据…

熊军出席ACDU·中国行南京站,详解SQL管理之道

12月21日&#xff0c;2024 ACDU中国行在南京圆满收官&#xff0c;本次活动分为三个篇章——回顾历史、立足当下、展望未来&#xff0c;为线上线下与会观众呈现了一场跨越时空的技术盛宴&#xff0c;吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…

Spring01 - 工厂篇

Spring入门(上)-工厂篇 文章目录 Spring入门(上)-工厂篇一&#xff1a;引言1&#xff1a;EJB存在的问题2&#xff1a;什么是Spring3&#xff1a;设计模式和反射工厂 二&#xff1a;第一个spring程序1&#xff1a;环境搭建2&#xff1a;核心API - ApplicationContext2.1&#xf…

攻防世界 unserialize3

开启场景 题目为unserialize3&#xff0c;这个单词在php中代表反序列化&#xff0c;代码 __wakeup 也是php反序列化中常见的魔术方法&#xff0c;所以这个题基本就是和反序列化有关的题目。根据代码提示&#xff0c;编写一个Exploit运行&#xff0c;将对象xctf的信息序列化 得到…

汽车免拆诊断案例 | 2011 款奔驰 S400L HYBRID 车发动机故障灯异常点亮

故障现象 一辆2011款奔驰 S400L HYBRID 车&#xff0c;搭载272 974发动机和126 V高压电网系统&#xff0c;累计行驶里程约为29万km。车主反映&#xff0c;行驶中发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;组合仪表上的发动机故障灯长亮&#xff1b;用故障检测…

GitLab安装及使用

目录 一、安装 1.创建一个目录用来放rpm包 2.检查防火墙状态 3.安装下载好的rpm包 4.修改配置文件 5.重新加载配置 6.查看版本 7.查看服务器状态 8.重启服务器 9.输网址 二、GitLab的使用 1.创建空白项目 2.配置ssh 首先生成公钥&#xff1a; 查看公钥 把上面的…

Electron 学习笔记

目录 一、安装和启动electron 1. 官网链接 2. 根据文档在控制台输入 3. 打包必填 4. 安装electron开发依赖 5. 在开发的情况下打开应用 6. 修改main为main.js&#xff0c;然后创建main.js 7.启动 二、启动一个窗口 1. main.js 2. index.html 3. 隐藏菜单栏 三、其他…

网络管理-期末项目(附源码)

环境&#xff1a;网络管理 主机资源监控系统项目搭建 &#xff08;保姆级教程 建议点赞 收藏&#xff09;_搭建网络版信息管理系统-CSDN博客 效果图 下面3个文件的项目目录(python3.8.8的虚拟环境) D:\py_siqintu\myproject5\Scripts\mytest.py D:\py_siqintu\myproject5\Sc…

62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)

项目介绍 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进…

MySQL用表组织数据

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

iOS开发代码块-OC版

iOS开发代码块-OC版 资源分享资源使用详情Xcode自带代码块自定义代码块 资源分享 自提&#xff1a; 通过网盘分享的文件&#xff1a;CodeSnippets 2.zip 链接: https://pan.baidu.com/s/1Yh8q9PbyeNpuYpasG4IiVg?pwddn1i 提取码: dn1i Xcode中的代码片段默认放在下面的目录中…