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();//2个字段 
 
//动态 
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

手动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

想要自动看下面

实体自动映射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].[TimeAS [Time] , --自动 
          [x].[SchoolName] AS [Name--手动 
          100 as [Count]  --手动
          FROM [SchoolA] x
          Left JOIN StudentA  y  ON ( [x].[SchoolId] =[y].[SchoolId])

实体自动映射2

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

//生成的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].[NameAS [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

实体自动映射3

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

比如一个3表查询 Order 、 OrderItem、Custom

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

public class ViewOrder
{
 public string Name { getset; } // ORDER表中的name 主表规则【字段名】
 public string CustomName { getset; }//查询的是Custom中的的name 从表规则【class+字段名】
 public string OrderItemPrice { getset; }//查询的是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.[NameAS [Name],
          c.[NameAS [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.高并发功能不建议使用,手写的性能肯定高于自动映射

匿名对象自动映射

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

.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#处理

方式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();

方式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<dynamic>(u => new
{
Id = u.Id.SelectAll(),
ChildrenCount = SqlFunc.Subqueryable<SysDictData>().Where(a => a.DictTypeId == u.Id).Count()
})

动态Select

//方式1:多库兼容
var selector= new List<SelectModel>() {
    new SelectModel(){AsName = "id1",FiledName = "id"},
    new SelectModel(){ FiledName = "id"}};
      
var list=db.Queryable<Order>()..Select(selector).ToList();
//更多复杂用法:https://www.donet5.com/Home/Doc?typeId=2421
  
//SELECT `id` AS `id1` , `id` AS `id` FROM `Order`
  
//方式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

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

返回元组

版本:5.1.4.84+

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();

SqlSugar的Select用法的更多相关文章

  1. html select用法总结

    本文将介绍select 原生的常用方法,这些都是经过测试,兼容ie6到ie10,及chrome,火狐等,也就是说大部分浏览器都兼容.如果大家发现有不兼容的情况,可以跟我留言. 我们对基本的用法了如指掌 ...

  2. 网络通信 --> select()用法

    select()用法 头文件 #include <sys/time.h> #include <sys/types.h> #include <unistd.h> 定义 ...

  3. python+selenium七:下拉框、选项框、select用法

    # from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimpo ...

  4. golang学习之select用法

    早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回.golang在语言级别直接支持select,用于处理异步IO问题. select用法同 ...

  5. 数据库Oracle的select用法(部分)

    Oracle的select用法(部分): 1.查询所有: select * from employees; 2.加上where子句:用选择限制行 select * from employees whe ...

  6. 每天玩转3分钟 MyBatis-Plus - 6. select 用法

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...

  7. select用法&原理详解(源码剖析)(转)

    今天遇到了在select()前后fd_set的变化问题,查了好久终于找到一个有用的帖子了,很赞,很详细!!原文链接如下: select用法&原理详解(源码剖析) 我的问题是: 如下图示:在se ...

  8. select用法

    每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...

  9. shell编程中的select用法

    select 语句 select表达式是bash的一种扩展应用,擅长于交互式场合.用户可以从一组不同的值中进行选择: select var in ... ; do break; done .... n ...

  10. 非阻塞式socket的select()用法

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只 是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程 ...

随机推荐

  1. xv6book阅读 chapter1

    xv6book主要研究了xv6如何实现它的类Unix接口,但是其思想和概念不仅仅适用于Unix.任何操作系统都必须将进程多路复用到底层硬件上,相互隔离进程,并提供受控制的进程间通信机制. 1 了解xv ...

  2. MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】

    MPI Maelstrom POJ - 1502 实验室有很多台计算机,由于每个人计算机的性能不同,导致计算机之间发送信息的速度不同,所以花费时间不同. 消息从第一台电脑发送到第二台电脑后,这两台电脑 ...

  3. Codeforces Round #727 (Div. 2) A~D题题解

    比赛链接:Here 1539A. Contest Start 让我们找出哪些参与者会干扰参与者i.这些是数字在 \(i+1\) 和 \(i+min(t/x,n)\)之间的参与者.所以第一个最大值 \( ...

  4. 理解CAP理论

    1. 理论什么是CAP? cap定理,它的提出是对于一个分布式系统得出的一个观点,是不能同时满足下面三点 一致性 可用性 分区容忍性 CAP理论认为,分布式系统最多只能同时满足其中的两个特性,而无法同 ...

  5. SpringCloud学习 系列十、服务熔断与降级(1-简介)

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  6. poi 4.11版本 word模板操作

    写代码之前先说说遇到的问题,之前word模板是使用poi 3.9的包实现的,之后又写了exlce上传下载的功能使用的是poi 4.11的版本,他们之间融合的时候发现包冲突,总有一个功能不能使用,之后发 ...

  7. Ubuntu 18.04安装arm-linux-gcc交叉编译器的两种方法(附下载地址)

    方法一:   我们都知道Ubuntu有一个专门用来安装软件的工具apt,我们可以用它来全自动安装arm-linux-gcc.   此方法安装的是最新版的,但是此方法需要FQ,否则99%会失败,这就是为 ...

  8. vue 路由跳转页面不刷新

    vue 路由跳转页面不刷新 点击打开视频讲解地址在router-view 里边添加 :key="$route.fullPath"

  9. Go socket 编程源码解析(上)

    0. socket 介绍 Liunx 中一切皆文件.通过文件描述符和系统调用号可以实现对任何设备的访问.同样的,socket 也是一种文件描述符.通过 socket 可以建立网络传输.对于 TCP 和 ...

  10. go 接口学习笔记

    这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...