架框介绍

SqlSugar是一款.NET老牌ORM 并且也是 新手基数比较多的ORM(因为上手容易),SqlSugar之所以能一直更新到现在,还是要感谢SqlSugar的忠实用户,随着我的技术越来越好,加上用户量越来越多,我也越来越勤快,功能也越来越注重细节

查询体系

用开源框架最怕遇到的就是想用一个功能发现没有,这个有时候就会非常麻烦,或者有这个功能发现不好用,SqlSugar是经过7年来真实的需求量身定制的,可以说在功能方面都比

EF CORE更加实用也不为过,一图看懂 SqlSugar查询功能

基础查询

基础查询 查询单条、主键查询、查所有、模糊查询、排序、TOP 、Count、查单条、IN等等操作
分页查询 分页查询
分组查询 分组查询和去重复  Group by   Distinct
排序  Order by  、随机排序、动态排序

多表查询

联表查询 使用Left Join  Inner Join进行查询
配置查询 简化联表操作,解决字典联表和简单Name联表问题

子查询

2个Queryable Join

查询中套查询,2个结果集进行JOIN等操作
导航查询 一对多 、一对一、多对多操作 ,有层级的查询
并集查询 Union all
树型查询 查询出一个树形结构,比如菜单


业务查询

无实体查询 没有实体查询
表格查询 前端组装好查询条件,后台直接使用
全局过滤器 比如很多地方用到假删除,那么我们可以配置加上IsDeleted
多库查询 如果表结构一样,那我们可以用一个实体操作不同表

高级功能

二级缓存 支持Redis等缓存,让你不需要维护 CacheKey轻松使用缓存来提高服务器性能
异步查询  使用异步进行查询
Sqlfun函数 使用SqlSugar自带的数据库函数查询
扩展Sql函数 当有些ORM不能解析的功能,可以自已封装SQL函数


Queryable

Select用法 一列、多列、匿名对象、多表映射等
Where用法 表达式、拼表达式、Sql、动态条件 等
生命周期 原理、引用类型、拷贝机制
执行查询

ToList  First  ToDateTable ToJson ToTree ToParentList ToSql  ToPivotList ToPivotTable

ToClassString  ToDictionary   ToDictionaryList   Count   Any  Sum

Max Min

报表

报表查询

让ORM可以方便的实现报表统计

Sql查询

Sql语句查询和分页

ORM实现报表

用ORM实现报表有2个短板

1. Sql可以方便的 创建临时表并且可以将这些临时表进行 JOIN 操作

2.Sql可以方便的实现行列互转操作

实践一、 按月统计没有记录为0

表结构如下

我们用Gropby实现查询,发现结果就只有3条记录,其中2月份就没有数据,那么这个Sql就不符合要求

这个时候我们就需要生成一个月份临时表

然后上面的表在和临时表 进行JOIN 在分组,会不会认为Sql也挺麻烦的呢?

用SqlSugar轻松实现

var queryableLeft = db.Reportable(ReportableDateType.MonthsInLast1years).ToQueryable<DateTime>(); //生成月份
//ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤
var queryableRight = db.Queryable<operateinfo>(); //声名表 //月份和表JOIN
var list= db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.operate_time.ToString("yyyy-MM")== x1.ColumnName .ToString("yyyy-MM"))
.GroupBy((x1,x2)=>x1.ColumnName)
.Select((x1, x2) => new {
count=SqlFunc.AggregateSum(SqlFunc.IIF(x2.id>0,1,0)) , //null的数据要为0所以不能用count
date=x1.ColumnName.ToString("yyyy-MM") }
).ToList();  

实践二、 指定月统计

还是这张表和数据,下面数据只有2条还是不符合要求,应该是31条记录

用SqlSugar实现

            var days = (time.AddMonths(1) - time).Days;//获取2021年1月的总天数
var dayArray = Enumerable.Range(1, days).ToList();//转成int数组
var queryableLeft = db.Reportable(dayArray).ToQueryable<int>();
var queryableRight = db.Queryable<operateinfo>();
var list= db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x2.operate_time.Day==x1.ColumnName)
.GroupBy((x1,x2)=>x1.ColumnName)
.Select((x1, x2) => new
{
count=SqlFunc.AggregateSum(SqlFunc.IIF(x2.id>0,1,0)) ,
day=x1.ColumnName }).ToList();

  

结果出来了,我们还能做的更好点在进行一下行转列

     var days = (time.AddMonths(1) - time).Days;//获取1月天数
var dayArray = Enumerable.Range(1, days).ToList();//转成int数组
var queryableLeft = db.Reportable(dayArray).ToQueryable<int>();
var queryableRight = db.Queryable<operateinfo>();
var list= db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x2.operate_time.Day==x1.ColumnName)
.GroupBy((x1,x2)=>x1.ColumnName)
.Select((x1, x2) => new
{
count=SqlFunc.AggregateSum(SqlFunc.IIF(x2.id>0,1,0)) ,
day=x1.ColumnName }).ToPivotTable( it=>it.day,it=> it.count, it=>it.Sum(x=>x.count));

  

实践三、对象和表随意JOIN

比如我们创建一个List对象,我们这个List对象就能和表进行Join了

        var list = new List<OrderItem>() {
new OrderItem(){ CreateTime=DateTime.Now, OrderId=1, Price=100 },
new OrderItem(){ CreateTime=DateTime.Now, OrderId=2, Price=120 }
};
var query1 = db.Queryable<Order>();
var queryable2 = db.Reportable(list).ToQueryable();
var x = db.Queryable(query1, queryable2, (x1, x2) => x1.Id.Equals(x2.OrderId))
.Select((x1, x2) => new { name = x1.Name,id=x1.Id, orderid = x2.OrderId }).ToList();

  

源码下载:

https://github.com/donet5/SqlSugar   记得点赞和推荐 SqlSugar将会一直更新,你的赞和推荐就是我最好的动力

用 .SqlSugar ORM 来实现报表功能 .NET CORE /.NET的更多相关文章

  1. 高性能数据导入方案&表过滤器&一对多支持筛选- .NET SqlSugar ORM

    一.数据导入有哪些难题 1.数据分类 你需要将 插入.更新.忽略不计.错误数据 等进么分类汇总,最后返回给客户,如果没有很好的设计想把这些操作一步到位非常的难 2.高性能 对于插入或者更新 肯定不能单 ...

  2. SqlSugar ORM已经支持读写分离

    目前只有MYSQL版 3.5.2.9 支持,其库版本12月3号更新该功能 用例讲解 using (var db = new SqlSugarClient("主连接字符串", &qu ...

  3. SqlSugar ORM 入门到精通【一】入门篇

    背景 SqlSugar是一款国产ORM,除了拥有媲美原生的性能 另外还有满足各种需求的功能,简单好用一分钟就能够轻松上手. 2.x版本正式在自已公司内部项目使用 3.x版本得到了更多公司的喜欢不过也会 ...

  4. Myeclipse2014 自带的报表功能 与 Eclipse BIRT

    Myeclipse2014 自带的报表功能跟 Eclipse BIRT 差不多,但不兼容   1.只能是MyEclipse Web projects 或者 Report Web project不支持B ...

  5. 记SqlSugar ORM框架之找不到主键问题

    前端时间在.NetCore项目中使用SqlSugar ORM框架(引用sqlSugarCore依赖包)的时候遇到了一个奇葩问题:对表进行数据更新操作的时候,报错 “ You cannot have n ...

  6. .Net Core 3.0 MVC 中使用 SqlSugar ORM框架

    介绍 SqlSugar 是一款简单易用的ORM ,在国内市场占有率也比较高, 在今年10月份官网改版后  提供了完整的服务,让您的项目没有后顾之忧 下载地址 :https://github.com/s ...

  7. 比较爽的导航查询 功能 - SqlSugar ORM

    1.导航查询特点 作用:主要处理主对象里面有子对象这种层级关系查询 1.1 无外键开箱就用 其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则开箱就用,无外键,只需配置特性和主键就能使用 ...

  8. Asp.Net 高性能ORM框架 SqlSugar.ORM 2.8

    3.0最新API: http://www.cnblogs.com/sunkaixuan/p/5911334.html 1.前言/Preface SqlSugar从去年到现在已经一年了,版本从1.0升到 ...

  9. ASP.NET - SqlSugar ORM框架 更新列表

    以后SqlSugar所有更新都会在这个贴子更新 SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSug ...

随机推荐

  1. 持续集成和持续交付工具-jenkins

    jenkins说明 jenkins是一款由Java编写的开源的持续集成工具,它运行在Servlet容器中(例如Apache Tomcat).它支持软件配置管理(SCM)工具(包括AccuRev SCM ...

  2. java基础——参数的应用

    命令行传递参数(少用) 有时候,你希望运行一个程序时,在传递给它信息.这个时候,要靠 传递命令行 参数 给main()函数实现. package com.dong.method;​public cla ...

  3. 解决nohup: 忽略输入并把输出追加到"nohup.out"或者nohup: 忽略输入重定向错误到标准输出端

    nohup启动脚本的时候,没有指定输出路径,默认使用当前目录的nohup.out 例如下面这句就是默认使用nohup.out作为输出文件: nohup script.sh & 改成下面的,则/ ...

  4. 029. Python多态介绍

    多态:不同的子类对象,调用相同的父类方法,产生不同的结果 继承 重写 在不改变原有代码的前提下,实现了不同的效果 class Soldier(): # 攻击 def attack(self): pas ...

  5. Django(37)配置django日志

    前言   django框架的日志通过python内置的logging模块实现的,既可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪.错误代码之类的详细信息.   ...

  6. [leetcode] 46. 全排列(Java)

    46. 全排列 这题我们可以借用31. 下一个排列写的nextPermutation函数来做,稍微改造一下即可 注意要先给nums排个序 class Solution { // 当没有下一个排列时re ...

  7. Go语言协程并发---等待组sync.WaitGroup

    package main import ( "fmt" "sync" "time" ) /*等待组API介绍*/ func main071( ...

  8. 3D点云完美匹配

    3D点云完美匹配 The Perfect Match: 3D Point Cloud Matching with Smoothed Densities 地址链接: http://openaccess. ...

  9. C ++变量,文字和常量

    C ++变量,文字和常量 本文将借助示例来学习C ++中的变量,文字和常量. C ++变量 在编程中,变量是用于保存数据的容器(存储区). 为了指示存储区域,应该为每个变量赋予唯一的名称(标识符).例 ...

  10. JUC 并发编程--03, 深刻理解锁, 8 锁现象,

    如何判断锁的是谁? 永远知道是什么锁, 线程8锁:就是关于锁的8个问题 问题1: public class LockDemo01 { public static void main(String[] ...