【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列

系列文章目录

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀


文章目录

  • 系列文章目录
  • 前言
  • 一、Select 执行位置
  • 二、返回一个字段和多个字段
  • 三、单表返回DTO
  • 四、多表返回DTO
    • 4.1 手动DTO
    • 4.2 实体自动映射1
    • 4.3 实体自动映射2
    • 4.4 实体自动映射3
    • 4.5 匿名对象自动映射
  • 五、创建DTO类
  • 六、多表查一表
  • 七、多表返回2表
  • 八、双查询结果用法
  • 九、Select之后对字段进行C#处理
    • 9.1 方式1 (5.1.4.113-preview+)
    • 9.2 方式2
  • 十、动态Select
  • 十一、别名AS用法
  • 十二、返回元组
  • 十三、过滤某一个字段
  • 总结
  • 系列文章目录


前言

说到 SQL 语句,最常见的也是最重要的两个关键词 莫过于 WhereSelect 两兄弟了。Where关键词主要用作条件筛选,使用频率那是大的不得了,那我们今天给它开个专场,看看ORM 框架里 Select 都有哪些语法。


一、Select 执行位置

正常情况:应该在最后面, 一般是 .Where(..).OrderBy(..).Select(..).ToList()

特殊情况:如果 Select 不是最后一个位置,则 Select 要加 MergeTable() 合并成一个表,

Select(...).MergeTable().Where

🍬语法糖

Select(...).MergeTable() 在新版本中可以用:

SelectMergeTable(it=>new xxx(){xx}).Where

二、返回一个字段和多个字段

List<int> listInt=db.Queryable<Student>().Select(it=> it.Id).ToList();//返回一个字段
DataTable list=db.Queryable<Student>().Select(it=>new { id=it.Id,name=it.Name}).ToDataTable();//2个字段 
List<Class1>list=db.Queryable<Student>().Select(it=>new Class1{id=it.Id,name=it.Name}).ToList();//2个字段 
List<dynamic>list=db.Queryable<Student>().Select(it=>(dynamic)new{id=it.Id,name=it.Name}).ToList(); 
 
//动态 
List<int> listInt=db.Queryable<Student>().Select<int>("id").ToList();
List<Order> listInt=db.Queryable<Student>().Select<ViewModel>("id as id, name as name").ToList();

三、单表返回DTO

//返回匿名对象
var dynamic = db.Queryable<Student>().Select<dynamic>().ToList();
//Select * from Student
 
//手动:返回匿名集合 支持跨程序集
List<dynamic> dynamicList = db.Queryable<Student>().Select(it=>(dynamic)new { id=it.id}).ToList();
//Select id as id from Student Select只有一列所以只查一列
 
//手动:返回匿名集合  不能跨程序集用
var dynamic = db.Queryable<Student>().Select(it=> new { id=it.id}).ToList(); 
 
//手动:返回类集合-手动
List<Student> list= db.Queryable<Student>().Select(it=>new  Student{ id=it.id}).ToList();
//Select id as id from Student Select只有一列所以只查一列
 
//自动返回DTO集合: 请升级 5.1.3.2 
var listDto= db.Queryable<Student>().Select<StudentDto>().ToList();//返回List
 
//自动返回DTO : 请升级 5.1.3.35  
var listDto= db.Queryable<Student>()
            .Select(it=>new StudentDto()
             {
                  Count=100 //手动指定一列在自动映射
             },
             true)//true表式开启自动映射
            .ToList();//返回List

四、多表返回DTO

4.1 手动DTO

var newClass= db.Queryable<Student, School, DataTestInfo>((st, sc, di) => new JoinQueryInfos(
    JoinType.Left, st.SchoolId == sc.Id,
    JoinType.Left, st.Name == di.String
)) 
.Select((st,sc,di)=>new ClassName{ name=st.Name,scid=sc.Id })//看这一行就行了
.ToList();//实体转换
 
//指定了2列只查2列
//select  st.name as name  , sc.id as scid

4.2 实体自动映射1

语法最美,新功能(5.1.3.35)

 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] x
          Left JOIN StudentA  y  ON ( [x].[SchoolId] =[y].[SchoolId])

4.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

4.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. 高并发功能不建议使用,手写的性能肯定高于自动映射。

4.5 匿名对象自动映射

🎯说明:自动主表赋值 表.*
🚨注意Oracle 如果用到 Take 或者 分页 需要改用 ToffsetPage() 替换。


.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是个语法糖

五、创建DTO类

这样就能快速拿到 DTO 类的实体字符串比手写要快的多。

string classtring=db.Qureyable<Order>().Select(....).ToClassString("命名空间");

六、多表查一表

var oneClass = 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) => c).ToList();

七、多表返回2表

var twoClass = 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 { o,i}).ToList()

八、双查询结果用法

当我们需要在 select 后在外面在包一层 select ,代码如下。

      var getAll = db.Queryable<Order>()
            .Select(it => new Order
            {
                Id = it.Id * 2,
                Name = it.Name
            })
            .MergeTable()//将上面的操作变成一个表 mergetable
            .GroupBy(it => it.Id)//对表mergetable进行分组
            .Select(it =>new{ id=it.Id }).ToList();//查询mergetable表里面的字段
             
//SELECT `Id` FROM  
//           (  SELECT  
//                    ( `Id` * @Id0 ) AS `Id` , 
//                    `Name` AS `Name` 
//                                    
//                FROM `Order ) MergeTable 
// GROUP BY `Id`
// 参数 @Id0:2

九、Select之后对字段进行C#处理

9.1 方式1 (5.1.4.113-preview+)

只能返回 string 只能是个单参数


    public class UnitTool
    {
        public static string GetName(string name) //定义一个string
        {
            return "name" + 111;
        }
    }
     
  //获取methodInfo    
  var methodInfo = typeof(UnitTool).GetMethod("GetName");
 
 var list8 = db.Queryable<Order>()
   .Select(it => new
   {
       n = it.Name,
       name = SqlFunc.OnlyInSelectConvertToString(it.Name, methodInfo)//只能是select中用
   }).ToList();

9.2 方式2

相对方式1用法麻烦 支持的功能全些。

实体类 :

var list= db.Queryable<Order>().Select(it=>new Order{ 
    Id=it.Id,
    Name=it.Name
    })
    .Mapper(it => { //只能写在Select后面
        it.Name = it.Id + it.Name;//相当于ToList循环赋值
    }).ToList();

匿名对象 :

var list = db.Queryable<Order>().Select(it=>
        (dynamic)new  //转成 dynamic
        { 
            Id=it.Id,
            Name=it.Name
    })
    .Mapper(it => { //只能写在Select后面
        it.Name = it.Id + it.Name;//相当于ToList循环赋值
    }).ToList();

🚨注意:( dynamic )不要漏了。

十、动态Select

//方式1:多库兼容
var selector= new List<SelectModel>() { 
    new SelectModel(){  FiledName = "id",AsName = "id2",},
    new SelectModel(){ FiledName = "id"} 
    //常量用法
    new SelectModel(){FieldName= "{string}:a",AsName="Name"}};
      
var list=db.Queryable<Order>().Select(selector).ToList();
//SELECT `id` AS `id2` , `id` AS `id` ,@Name as Name FROM `Order`
//更多复杂用法: https://www.donet5.com/Home/Doc?typeId=2421
 
  
//方式2:直接写SQL
var list=db.Queryable<Order>().Select("ID AS id1,id as id").ToList();
 
 
//方式3: 动态表达式 
StaticConfig.DynamicExpressionParserType = typeof(DynamicExpressionParser); //启动时配置
 
var list= db.Queryable<Order>().Select("it", $"it=>new(it.Id as Id, it.Name)", typeof(Order)).ToList();
 
//需要SqlFunc:https://www.donet5.com/Home/Doc?typeId=2569

十一、别名AS用法

Select(it=>new { id1=it.id ,name2 =it.name })
//select id as id1,name as name2

如果是动态看 上面一个标题

十二、返回元组

List<(int Id, string Name)> list
                = db.Queryable<Order>().Select<(int Id, string Name)>("id,name").ToList();

十三、过滤某一个字段

/***单表***/
db.Queryable<Order>().IgnoreColumns(it=>it.Files).ToList();//只支持单表查询
   
   
/***联查***/
//是主表
var leftQuery=db.Queryable<Order>().IgnoreColumns(it=>it.Files);
var list=db.Queryable(leftQuery).LeftJoin<OrderDetails>((o,d)=>o.id==d.orderid).Select(o=>o).ToList();    
  
//是Join的表
var rightQuery= db.Queryable<OrderItem>().IgnoreColumns(it=>it.Files);
var list=db.Queryable<Order>().LeftJoin(rightQuery,(o,d)=>o.Id == d.OrderId).Select(o=>o).ToList();

总结

感觉东西太多了,脑子记不住啊。大家都是一样,只要大概记住有这么个概念就行,等需要的时候再来翻翻笔记。


系列文章目录

🎀💎🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀💎🎀

【开篇】.NET开源 ORM 框架 SqlSugar 系列
【入门必看】.NET开源 ORM 框架 SqlSugar 系列
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
【Db First】.NET开源 ORM 框架 SqlSugar 系列
【Code First】.NET开源 ORM 框架 SqlSugar 系列
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
【连接池】.NET开源 ORM 框架 SqlSugar 系列
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
【联表查询】.NET开源 ORM 框架 SqlSugar 系列
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
【子查询】.NET开源 ORM 框架 SqlSugar 系列
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
【配置查询】.NET开源 ORM 框架 SqlSugar 系列
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
【树型查询】.NET开源 ORM 框架 SqlSugar 系列
【表格查询】.NET开源 ORM 框架 SqlSugar 系列
【动态表达式】.NET开源 ORM 框架 SqlSugar 系列
【查询函数】.NET开源ORM框架 SqlSugar 系列
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
【跨库查询、多库查询】.NET开源 ORM 框架
​【报表查询】.NET开源ORM框架 SqlSugar 系列
【Where语法全解密】.NET开源ORM框架 SqlSugar 系列

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC服务质量(11)- Pacer机制(03) IntervalBudget

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…

计算机图形学知识点汇总

一、计算机图形学定义与内容 1.图形 图形分为“图”和“形”两部分。 其中&#xff0c;“形”指形体或形状&#xff0c;存在于客观世界和虚拟世界&#xff0c;它的本质是“表示”&#xff1b;而图则是包含几何信息与属性信息的点、线等基本图元构成的画面&#xff0c;用于表达…

Nginx区分PC端和移动端访问

在使用Nginx时&#xff0c;可以通过$http_user_agent变量来判断用户访问的客户端类型&#xff0c;从而提供不同的内容或服务。下面是一个基于$http_user_agent变量来判断是否为PC访问的Nginx配置示例。 1. 理解$http_user_agent变量的含义及其在Nginx中的用途 $http_user_agen…

方法。。。

1. 方法概述 1.1 方法的概念 ​** 方法&#xff08;method&#xff09;是程序中最小的执行单元** 注意&#xff1a; 方法必须先创建才可以使用&#xff0c;该过程成为方法定义方法创建后并不是直接可以运行的&#xff0c;需要手动使用后&#xff0c;才执行&#xff0c;该过程…

jasypt原理

jasypt原理 一、背景知识二、原理分析1、(uml中蓝色)加载Encryptor、Detector和Resolver2、(uml中红色)加载EnableEncryptablePropertiesBeanFactoryPostProcessor3、(uml中绿色)解密过程 以jasypt 1.14为例 一、背景知识 需要了解spring的加载顺序&#xff1a; step1:主要是…

【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用

目录 概念 基本使用案例 效果 步骤 概念 UGameInstanceSubsystem 类继承自 USubsystem&#xff0c;它与 GameInstance 紧密关联&#xff0c;旨在为游戏提供一种模块化、可方便扩展和管理的功能单元机制。在整个游戏运行期间&#xff0c;一个 GameInstance 可以包含多个 UGa…

SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法

本篇博客将深入探讨 MyBatis-Plus 的三个核心功能&#xff1a;条件构造器、自定义 SQL 和 Service 接口的基本用法。通过对这些功能的学习和掌握&#xff0c;开发者能够更加高效地使用 MyBatis-Plus 进行业务开发。 目录 前言 条件构造器 自定义SQL Service接口基本用法 总结…

我的 2024 年终总结

2024 年&#xff0c;我离开了待了两年的互联网公司&#xff0c;来到了一家聚焦教育机器人和激光切割机的公司&#xff0c;没错&#xff0c;是一家硬件公司&#xff0c;从未接触过的领域&#xff0c;但这还不是我今年最重要的里程碑事件 5 月份的时候&#xff0c;正式提出了离职…

STM32-笔记11-手写带操作系统的延时函数

1、为什么带操作系统的延时函数&#xff0c;和笔记10上的延时函数不能使用同一种&#xff1f; 因为笔记10的延时函数在每次调用的时候&#xff0c;会一直开关定时器&#xff0c;而在FreeRTOS操作系统中&#xff0c;SysTick定时器当作时基使用。 时基是一个时间显示的基本单位。…

人工智能与物联网:从智慧家居到智能城市的未来蓝图

引言&#xff1a;未来已来&#xff0c;智能化的世界 想象一下&#xff0c;一个早晨&#xff0c;智能闹钟根据你的睡眠状态自动调整叫醒时间&#xff0c;咖啡机早已备好热腾腾的咖啡&#xff0c;窗帘缓缓拉开&#xff0c;迎接清晨的阳光。这不是科幻小说中的场景&#xff0c;而是…

流程控制

第一章 流程控制语句 在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。所以&#xff0c;我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能。 1.1 流程控制语句分类 ​ 顺序结构 …

台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)

以下是开发台球助教系统客户端&#xff08;APP&#xff0c;小程序&#xff0c;H5&#xff09;几端的信息收藏功能的详细需求和功能说明&#xff0c;内容比较详细&#xff0c;可以说是一个教科书式的详细说明了&#xff0c;这套需求说明不仅仅用在我们的台球助教系统程序上&…

RISC-V 医疗芯片发展方向探究及展望

&#xff08;一&#xff09;研究背景与意义 近年来&#xff0c;RISC-V作为一种开源指令集架构在芯片领域迅速兴起。它起源于加州大学伯克利分校&#xff0c;于2011年首次公开发布&#xff0c;后凭借其独特优势吸引了全球众多企业、机构以及科研人员的关注与参与。RISC-V具有开…

三维动画的常用“视觉特效”有哪些?

在当今的视觉盛宴中&#xff0c;三维动画技术宛如一位神奇的魔法师&#xff0c;为视觉特效&#xff08;VFX&#xff09;领域施下了变革的咒语。从大荧幕上的震撼电影&#xff0c;到让人沉浸其中的视频游戏&#xff0c;再到夺人眼球的广告以及精细的模拟场景&#xff0c;三维动画…

【EtherCATBasics】- KRTS C++示例精讲(2)

EtherCATBasics示例讲解 目录 EtherCATBasics示例讲解结构说明代码讲解 项目打开请查看【BaseFunction精讲】。 结构说明 EtherCATBasics&#xff1a;应用层程序&#xff0c;主要用于人机交互、数据显示、内核层数据交互等&#xff1b; EtherCATBasics.h &#xff1a; 数据定义…

前端初学基础

一.Web开发 前端三件 HTML &#xff0c;页面展现 CSS&#xff0c;样式 JS(JavaScript),动起来 二&#xff0c;HTML 1.HTML概念 网页&#xff0c;网站中的一个页面&#xff0c;网页是构成网站的基本元素&#xff0c;是承载各种网站应用的平台。通俗的说&#xff0c;网站就…

C语言结构体位定义(位段)的实际作用深入分析

1、结构体位段格式 struct struct_name {type [member_name] : width; };一般定义结构体&#xff0c;成员都是int、char等类型&#xff0c;占用的空间大小是固定的在成员名称后用冒号来指定位宽&#xff0c;可以指定每个成员所占用空间&#xff0c;并且也不用受结构体成员起始…

机器学习之PCA降维

主成分分析&#xff08;PCA&#xff0c;Principal Component Analysis&#xff09; 主成分分析&#xff08;PCA&#xff09;是一种常见的无监督学习技术&#xff0c;广泛应用于数据降维、数据可视化以及特征提取等任务。PCA的目标是通过线性变换将数据从高维空间映射到低维空间…

x86_64 Ubuntu 编译安装英伟达GPU版本的OpenCV

手把手带你在Linux上安装带GPU加速的opencv库&#xff08;C版本&#xff09;_opencv linux-CSDN博客 cmake \-D CMAKE_BUILD_TYPERELEASE \-D OPENCV_GENERATE_PKGCONFIGON \-D CMAKE_INSTALL_PREFIX/usr/local \-D OPENCV_EXTRA_MODULES_PATH/home/hwj/opencv/opencv_contrib…