【联表查询】.NET开源 ORM 框架 SqlSugar 系列

   .NET开源 ORM 框架 SqlSugar 系列

  1. 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  2. 【入门必看】.NET开源 ORM 框架 SqlSugar 系列
  3. 【实体配置】.NET开源 ORM 框架 SqlSugar 系列
  4. 【Db First】.NET开源 ORM 框架 SqlSugar 系列
  5. 【Code First】.NET开源 ORM 框架 SqlSugar 系列
  6. 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
  7. 【连接池】.NET开源 ORM 框架 SqlSugar 系列
  8. 【查询目录】.NET开源 ORM 框架 SqlSugar 系列
  9. 【查询基础】.NET开源 ORM 框架 SqlSugar 系列
  10. 【排序用法】.NET开源 ORM 框架 SqlSugar 系列
  11. 【分组去重】.NET开源 ORM 框架 SqlSugar 系列
  12. 【联表查询】.NET开源 ORM 框架 SqlSugar 系列
  13. 【导航查询】.NET开源 ORM 框架 SqlSugar 系列
  14. 【子查询】.NET开源 ORM 框架 SqlSugar 系列
  15. 【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列

💦万丈高楼平地起,做开发想要技术精进,必须要有扎实的基础功底。基础SQL查询语法一定要牢记于心,才能应对后面更为复杂的形势。

e57c501b379f46dfb38d3b8584575f1f.png

一、Join用法 

1.1 语法糖1 

👍优点:好理解,5个表以内的联表非常爽,支持功能全

😒缺点:  联表超过5个以上的表后 (x,b,c...) 会比较难看,语法糖2可以弥补

 场景1:表和表的左连接 LeftJoin<T>()  

//联表查询
var query5 = db.Queryable<Order>().LeftJoin<Custom>((o,cus) => o.CustomId == cus.Id)//多个条件用&&.LeftJoin<OrderDetail> ((o,cus,oritem) => o.Id == oritem.OrderId).Where(o => o.Id == 1)  .Select((o,cus,oritem) => new ViewOrder {Id=o.Id,CustomName = cus.Name }).ToList();  //ViewOrder是一个新建的类,更多Select用法看下面文档//内联用 .InnerJoin
//FullJoin 需要高版本才支持用法一样//注意:Join (a,b)=> 别名用法: 
a,b //正确用法
a,b,c
a,b,c,d a,b //错误用法
a,c
a,d

生成的SQL

SELECT[o].[Id] AS [Id],[cus].[Name] AS [CustomName]
FROM[Order] oLeft JOIN [Custom] cus ON ([o].[CustomId] = [cus].[Id])Left JOIN [OrderDetail] oritem ON ([o].[Id] = [oritem].[OrderId])
WHERE([o].[Id] = @Id0)

 场景2:表和 Queryable  JOIN 

var rigtQueryable = db.Queryable<Custom>().LeftJoin<OrderItem>((o, i) => o.Id == i.ItemId).Select(o => o);var List = db.Queryable<Order>().LeftJoin(rigtQueryable, (c, j) => c.CustomId == j.Id).Select(c => c).ToList(); //SELECT c.* FROM [Order] c Left JOIN //(SELECT o.* FROM [Custom] o Left JOIN [OrderDetail] i ON ( [o].[Id] = [i].[ItemId] )  ) j //ON ( [c].[CustomId] = [j].[Id] )

 场景3:Queryable 和表 JOIN  

var queryable=db.Queryable<Order>();
var list=db.Queryable(queryable).LeftJoin<OrderDetails>((o,d)=>o.id==d.orderid).Select(o=>o).ToList();

1.2 语法糖2  

👍优点1:这种适合联表比较多的比如5个以上的表  JOIN  写起来会比较爽

👍优点2:因为是一个参数更容易封装成方法 例如 Queryable<T,T2>(expression)

👍优点3:   升级到最新支持 Cross Join ,用法 JoinType.CrossJoin ,条件写it=>true

😒缺点:不支持 LeftJoin(queryable) 这种嵌套

单表查询是基于 db.Queryable<T>

//生成的Sql: from [Order]
db.Queryable<Order>

联表查询是基于多个T,例如 db.Queryable<T, T2,T3>  3个T就是3表查询

db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(JoinType.Left, o.Id == i.OrderId, //左连接 左链接 左联 JoinType.Left, o.CustomId == c.Id 
))
.Select((o,i,c)=>new ViewModel{ name=o.Name ..})
.ToList()//3个T代表3个表查询,并且按顺序排列
//Order  o     
//OrderItem i   关系 JoinType.Left, o.Id == i.OrderId
//Custom c     关系 JoinType.Left, o.CustomId == c.Id      
//那么生成的Sql就是
// FROM [Order] o 
// Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] )  
// Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] )

因为多个T的原因所以在  Where 、 Select 、OrderBy、GroupBy 操作上同单表查询稍有差别

💥常见错误:数组超过界限  5个T就是4个JOIN , 8个T就是7个JOIN ,不要写多了或者写少了

1.3 语法糖3

如果全部是 Inner Join 可以用这种方式直接联表

var list = db.Queryable<Order, OrderItem, Custom>((o, i, c) => o.Id == i.OrderId&&c.Id == o.CustomId).Select((o,i,c)=>new Class1{ Id=o.Id,Name=o.Name,CustomName=c.Name}).ToList(); //Class1是一个新建的类,更多Select用法看下面文档

生成的SQL

SELECT  c.[Name] AS [CustomName],o.[Id] AS [Id],o.[Name] AS [Name]       FROM [Order] o  ,[OrderDetail]  i ,[Custom]  c  WHERE (( [o].[Id] = [i].[OrderId] ) AND ( [c].[Id] = [o].[CustomId] ))

二、Where用法

🤖注意:写在.Select()之前

.Where(o=>o.id==1) //只用到o这样写就行
.Where((o,i)=>i.xx==1) //如果用到i需要这么写
//更多用法:https://www.donet5.com/Home/Doc?typeId=1184

三、OrderBy用法

🤖注意:写在.Select()之前


.OrderBy(o=>o.id) //只用到o这样写就行
.OrderBy((o,i)=>i.xx) //如果用到i需要这么写
//更多用法: https://www.donet5.com/Home/Doc?typeId=2312

四、GroupBy用法

🤖注意:写在.Select()之前

.GroupBy(o=>o.id) //只用到o这样写就行
.GroupBy((o,i)=>i.xx) //如果用到i需要这么写
//更多用法: https://www.donet5.com/Home/Doc?typeId=2243

五、Select 用法

📌Select位置:

  1. 正常情况后面一般是 .Where(..).OrderBy(..).Select(..).ToList()
  2. 如果 Where 等要写在 Select 后面应该 用 Select(...).MergeTable().Where
  3. 别名建议写全,后面方便维扩
  4. 例如三表查询:(o,i,c)=>  (不建议 o=> 或者 (o,i)=>)

5.1 手动映射

✍️ Select 写几列 查几列,不多查

//新类
.Select((o,i)=>new 类名{Id=o.Id,Name=o.Name,SchoolName=i.Name}).ToList();
//匿名对象
.Select((o,i)=>new {Id=o.Id,Name=o.Name,SchoolName=i.Name}).ToList();
//更多用法看文档下面

5.2 实体自动映射1

🫶语法最美,先指定自定义字段,true 表示其余字段根据字段名自动映射。

 var list4=db.Queryable<SchoolA>().LeftJoin<StudentA>((x, y) => (x.SchoolId == y.SchoolId)).Select((x,y) => new UnitView01(){Name=x.SchoolName,Count=100},true)//true表示 其余字段自动映射,根据字段名字.ToList();

生成的Sql如下:

SELECT        [x].[ID] AS [id] , --自动[x].[Time] AS [Time] , --自动 [x].[SchoolName] AS [Name] --手动 100 as [Count]  --手动FROM [SchoolA] xLeft JOIN StudentA  y  ON ( [x].[SchoolId] =[y].[SchoolId])

5.3 实体自动映射2

💥说明:通过 x.* 方式实现多表查询

🤖注意: Oracle如果用到Take或者分页 需要改用ToffsetPage()替换

//生成的SQL为 Select o.*, [c].[Name] AS [CustomName]
var oneClass = db.Queryable<Order>().LeftJoin<OrderItem>((o,i)=>o.Id == i.OrderId).LeftJoin<Custom>((o,i,c)=>o.CustomId == c.Id).Where(o=>o.Id>1)
.Select((o,i,c)=> new ViewOrder// 是一个新类
{      //Id是o任意一个属性Id=o.Id.SelectAll(),   //  等于 o.*   (SelectAll建议用一张表,多表会容易重名)CustomName=c.Name   // 等于 [c].[Name] AS [CustomName]
}).ToList()

生成Sql如下

SELECT o.*, [c].[Name] AS [CustomName] FROM  [Order] o Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] )  Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] ) WHERE [o].[Id]>1

5.4 实体自动映射3

💥说明:通过约束实现自动映射

比如一个3表查询 Order OrderItem Custom 

需要注意的是 Select 用的是自动填充这样使用方便,高并发的地方还是写成上面那种方式(5.0.5.2性能优化提升)

public class ViewOrder
{public string Name { get; set; } // ORDER表中的name 主表规则【字段名】public string CustomName { get; set; }//查询的是Custom中的的name 从表规则【class+字段名】public string OrderItemPrice { get; set; }//查询的是OrderItem中的name 从表规则【 class+字段名】
}
var viewModel= db.Queryable<Order>().LeftJoin<OrderItem>((o,i)=>o.Id == i.OrderId).LeftJoin<Custom>((o,i,c)=>o.CustomId == c.Id).Select<ViewOrder>().ToList();

sql:

SELECT o.[Name] AS [Name],c.[Name] AS [CustomName],i.[Price] AS [OrderItemPrice] FROM [Order] o Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] )  Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] )

💥注意: 

         1. ViewOrder 必须每个列都能匹配到字段,否则就无法按规则匹配,保证每个列都正确

         2. 高并发功能不建议使用,手写的性能肯定高于自动映射

5.5 匿名对象自动映射

说明:自动主表赋值  表.*

.Select<dynamic>((st,sc)=> new  
{ //id是st任意一个属性id=st.Id.SelectAll(), //  st.*  (SelectAll建议只用一张表,不然查询列会有重名)SchoolName=sc.Name // Name as  SchoolName
}).ToList()
//Select st.*,[sc].[Name] AS [schoolName]//.SelectAll等同于SqlFunc.GetSelfAndAutoFill是个语法糖

六、导航属性联表

如果有配置过导航, 这个就比较简单了 Join 都不要写了,懒人可以用

//实体
public class StudentA
{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int StudentId { get; set; }public string Name { get; set; }public int SchoolId { get; set; }[Navigate(NavigateType.OneToOne, nameof(SchoolId))]//一对一 SchoolId是StudentA类里面的public SchoolA SchoolA { get; set; } //不能赋值只能是null}
public class SchoolA
{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int SchoolId { get; set; }public string SchoolName { get; set; }
}/*** 在配好导航后可以: 导航对象.具体属性 进行使用 ***///IncludeLeftJoin 会根据导航生成LeftJoin语句 (IncludeLeftJoin)
var list = db.Queryable<StudentA>()//From StudentA x.IncludeLeftJoin(x=>x.SchoolA) // Left Join SchoolA y on x.SchoolId=y.Id.Where(x =>x.SchoolA.SchoolName=="北大")//Where y.SchoolName='北大'.ToList();//IncludeInnerJoin也是一样//没有IncludeLeftJoin在Where中也可以直接用(SQL是子查询过滤)var list = db.Queryable<StudentA>().Where(x =>x.SchoolA.SchoolName=="北大")//导航对象过滤  .ToList();//没有IncludeLeftJoin在Select中也可以直接用(SQL是子查询实现)   
var list = db.Queryable<StudentA>().Where(x => x.id>1)  //Where和Select中别名要写一样.Select(x =>new { name=x.Name,SchoolName= x.SchoolA.SchoolName}).ToList();//IncludeLeftJoin 会根据导航生成LeftJoin语句 (IncludeLeftJoin)
var list = db.Queryable<StudentA>().IncludeLeftJoin(x=>x.SchoolA) //Left Join SchoolA y on x.SchoolId=y.Id.Where(x =>x.SchoolA.SchoolName=="北大")//y.SchoolName='北大'.ToList();

七、联表查询设置别名

var list1 = db.Queryable<Order>().AS("Order001").LeftJoin<OrderItem>((o,i)=> o.Id == i.OrderId,"OrderItem001")  .LeftJoin<Custom>((o, i, c) => c.Id == o.CustomId,"Custom001") .Where((o,i,c)=> o.TypeId==1).Select((o,i,c)=>new classA() { oid=o.Id , iname=i.Name }).ToList();

八、子查询和嵌套查询

8.1 子查询 

var list= db.Queryable<Student>().Where(it => SqlFunc.Subqueryable<School>().Where(s =>s.Id==it.Id).Any()).ToList();var list= db.Queryable<Student>().Select(st => new{name = st.Name,id = SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Select(s => s.Id)}).ToList();

8.2 嵌套查询

//Queryable联表      
var q11 = db.Queryable<Order>().Where(it => it.Id>1); 
var q22 = db.Queryable<Order>().Where(it => it.Id > 2); 
var q33 = db.Queryable<Order>().Where(it => it.Id > 3);  
var list= q11.LeftJoin(q22, (x, y) => x.Id == y.Id).LeftJoin(q33, (x, y, z) => x.Id == z.Id).ToList();

九、超过12个表的联表

我们可以通用 Megetable 进行合并成一个表,然后在进行JOIN。

db.Queryable<Order>().LeftJoin<OrderItem>((x, y) => x.id == y.ItemId) .LeftJoin.....省略.LeftJoin.....省略 .....省略.Select((x,y,z,.......省略) => new {xid=x.id,yid=y.ItemId}) .MergeTable()//合并   .LeftJoin<OrderItem>((x,y)=>x.yid==y.ItemId)// 最后一个表不是匿名对象就行.ToList();

十、动态Join条件

 10.1 条件动态

var exp2=Expressionable.Create<Order, Custom>();
exp2.And((o,cus)=>o.CustomId == cus.Id);
exp2.AndIF(Name!=null,(o, cus) => o.Name==Name);var list= db.Queryable<Order>().LeftJoin<Custom>(exp2.ToExpression())//动态拼出来的条件.LeftJoin<OrderDetail>((o, cus, oritem) => o.Id == oritem.OrderId).Where(o => o.Id == 1) .ToList();

10.2  表动态

var list= db.Queryable<Order>().LeftJoinIF<Custom>(条件 ,(o, cus) => o.CustomId == cus.Id)//条件成立才会生成Join这个表.LeftJoin<OrderDetail>((o, cus, oritem) => o.Id == oritem.OrderId).ToList();//InnerJoinIF一样用法//没有SelectIF方案
var fileName = true ? "name" : "name2";
var list=db......Select(it=>new {name=SqlFunc.MappingColumn<string>(fileName)}).ToList();

十一、Cross Join

 Cross join 只支持语法糖二

  var userInfo = db.Queryable<UserInfo001, UserInfo001>((x, y) => new JoinQueryInfos(JoinType.Cross, true)).Select(x=>new { name=x.UserId}).ToList();//SELECT  [x].[UserId] AS [name]  FROM [UserInfo001] [x] Cross JOIN [UserInfo001] [y]

   .NET开源 ORM 框架 SqlSugar 系列

  1. 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  2. 【入门必看】.NET开源 ORM 框架 SqlSugar 系列
  3. 【实体配置】.NET开源 ORM 框架 SqlSugar 系列
  4. 【Db First】.NET开源 ORM 框架 SqlSugar 系列
  5. 【Code First】.NET开源 ORM 框架 SqlSugar 系列
  6. 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
  7. 【连接池】.NET开源 ORM 框架 SqlSugar 系列
  8. 【查询目录】.NET开源 ORM 框架 SqlSugar 系列
  9. 【查询基础】.NET开源 ORM 框架 SqlSugar 系列
  10. 【排序用法】.NET开源 ORM 框架 SqlSugar 系列
  11. 【分组去重】.NET开源 ORM 框架 SqlSugar 系列
  12. 【联表查询】.NET开源 ORM 框架 SqlSugar 系列
  13. 【导航查询】.NET开源 ORM 框架 SqlSugar 系列
  14. 【子查询】.NET开源 ORM 框架 SqlSugar 系列
  15. 【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列

 

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

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

相关文章

标贝科技受邀出席2024东湖国际人工智能高峰论坛并入选数据要素合作伙伴名单

近日&#xff0c;备受瞩目的2024东湖国际人工智能高峰论坛在中国光谷科技会展中心隆重召开。会议以“智联世界&#xff0c;共创未来”为主题&#xff0c;省市相关单位、专家学者、产学研各界百余家联合体单位齐聚一堂&#xff0c;共话人工智能领域的最新技术及产业发展趋势。会…

使用AI工具Screenshot to Code将UI设计图翻译成代码

一、获取openAI apikey。 一般有两种方式&#xff0c;一种是到openAI官网注册账号&#xff0c;付费申请GPT4的apikey。另一种是某宝买代理。我这里采用第二种。 二、安装Screenshot to Code 1.到github下载源码。 2.启动&#xff0c;两种方式&#xff1a;源码启动和docker启动…

VMware Workstation Pro安装教程 (全图文保姆级)

一、前言 系统&#xff1a;Windows 11时间&#xff1a;2024/12/04需求&#xff1a;注册&#xff1a;broadcom&#xff08;邮箱&#xff09;难点&#xff1a;在官网找到下载链接 二、说明 建议前往官网&#xff08;https://www.vmware.com&#xff09;下载&#xff0c;可能加…

前端开发 之 15个页面加载特效下【附完整源码】

文章目录 十二&#xff1a;铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三&#xff1a;扇形百分比加载特效1.效果展示2.HTML完整代码 十四&#xff1a;四色圆环显现加载特效1.效果展示2.HTML完整代码 十五&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 十二&#xff…

protobuf实现Hbase数据压缩

目录 前置HBase数据压缩效果获取数据(反序列化) 前置 安装说明 使用说明 HBaseDDL和DML操作 HBase数据压缩 问题 在上文的datain中原文 每次写入数据会写入4个单元格的内容&#xff0c;现在希望能对其进行筛减&#xff0c;合并成1格&#xff0c;减少存储空间&#xff08;序列…

Svn如何切换删除账号

记录Svn清除切换账号 1.首先打开小乌龟的设置如下图 打开设置后单击已保存数据&#xff0c;然后选择清除 接上图选择清除后&#xff0c;就可以打勾选择清除已保存的账号&#xff0c;我们再次检出的就可以切换账号了 &#x1f449;总结 本次记录Svn清除切换账号 如能帮助到你…

正点原子imx6ull配置MQTT客户端上传数据到Ubuntu MQTT服务器

目录 使用QT自带的MQTT模块部署客户端创建一个class专门用于MQTT客户端通讯使用QT在ui界面上生成按钮在Windows上订阅相应主题测试在imx6ull上订阅Windows发布的消息 在上一篇中介绍了在Ubuntu22.04的Docker中部署MQTT服务器&#xff0c;然后在window上测试订阅和发布&#xff…

Linux的用户和权限【Linux操作系统】

文章目录 Linux的用户切换用户普通用户暂时以root用户的权限执行指令如何把一个普通用户加入白名单? 新建用户 Linux权限权限的组成更改权限文件/目录权限的表示方法&#xff1a; umask粘滞位添加粘滞位的方法 Linux的用户 Linux下有两种⽤⼾&#xff1a;超级用户&#xff08…

clang和gcc的区别

​ 1.Clang采用的license是BSD&#xff0c;而GCC是GPLv3&#xff1b;GCC支持许多语言扩展&#xff0c;其中有些Clang不能实现。 2.GCC&#xff1a;GNU(Gnu’s Not Unix)编译器套装(GNU Compiler Collection&#xff0c;GCC)&#xff0c;指一套编程语言编译器&#xff0c;以GPL…

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年&#xff0c;OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是&#xff0c;在AI驱动的…

DICOM MPPS详细介绍

文章目录 前言一、常规检查业务流程二、MPPS的作用三、MPPS的原理1、MPPS与MWL2、MPPS服务过程 四、MPPS的实现步骤1、创建实例2、传递状态 五、总结 前言 医院中现有的DICOM MWL(Modality Worklist)已开始逐渐得到应用&#xff0c;借助它可以实现病人信息的自动录入&#xff0…

【笔记2-3】ESP32 bug:PSRAM chip not found or not supported 没有外部PSRAM问题解决

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…

【0x3D】HCI_Remote_Host_Supported_Features_Notification事件详解

目录 一、事件概述 二、事件格式及参数说明 2.1. HCI_Remote_Host_Supported_Features_Notification事件格式 2.2. BD_ADDR 2.3. Remote_Host_Supported_Features 三、事件作用 3.1. 设备特性沟通与理解 3.2. 功能协商与性能优化 3.3. 设备管理与配置更新 四、应用场…

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念 什么是AVL树&#xff1f; AVL树是一种自平衡的二叉搜索树&#xff0c;其发明者是Adelson-Velsky和Landis&#xff0c;因此得名“AVL”。AVL树是首个自平衡二叉搜索树&#xff0c;通过对树的平衡因子进行控制&#xff0c;确保任何节点的左右子树高度差最多为1&…

Css动画:旋转相册动画效果实现

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展&#xff0c;网页不再局限于静态展示&#…

ElasticSearch 与向量数据库的结合实践:突破亿级大表查询瓶颈20241204

&#x1f4a1; ElasticSearch 与向量数据库的结合实践&#xff1a;突破亿级大表查询瓶颈 &#x1f4da; 引言 随着业务规模的不断扩大&#xff0c;传统关系型数据库在处理 亿级大表 时&#xff0c;性能瓶颈愈加凸显。关键词检索、模糊查询、多条件筛选等需求逐步升级&#xff…

解决stable-diffusion-webui时的问题:No module ‘xformers‘. Proceeding without it

p.s 被另一篇文章坑了&#xff0c;装个xformers把我原先的pytorch降智了&%$^# 注意&#xff1a;&#xff01;&#xff01;&#xff01;xformers非强制安装&#xff1b;可优化显存&#xff0c;提高性能和出图速率&#xff0c;对于GPU能力有限的用户很有用&#xff1b;安装过…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux 权限管理:用户分类、权限解读与常见问题剖析

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 目录 &#x1f4af;L…