首页 > 数据库 >SqlSugar列转行扩展方法

SqlSugar列转行扩展方法

时间:2023-06-05 16:24:32浏览次数:50  
标签:MemberExpression Body 转行 扩展 MBZ var new PAEZ SqlSugar

参考

C# 行列互转 List、DataTable和匿名对象 行转列
SQL Server 列转行的实现
MemberExpression 类
MemberInfo 类

代码

点击查看代码-扩展方法
 public static class UnPivotQueryMethod
    {
        public static List<TRow> ToUnPivotList<T, TRow, TCol, TColName, TData>(
            this ISugarQueryable<T> queryable,
            Func<T, TRow> rowSelector,
            Expression<Func<TRow, TData>> dataSelector,
            Expression<Func<TRow, TColName>> colNameSelector,
            Expression<Func<T, TCol>> colSelector)
        {
            var dataList = queryable.ToList();
            var resList = new List<TRow>();

            var tDataName = string.Empty;
            if(dataSelector.Body is MemberExpression)
            {
                tDataName = ((MemberExpression)dataSelector.Body).Member.Name;
            }
            else
            {
                throw new Exception("dataSelector表达式错误,需要dataSelector.Body is MemberExpression判断成立");
            }
            var colLabelName = string.Empty;
            if (colNameSelector.Body is MemberExpression)
            {
                var colLabelInfo = ((MemberExpression)colNameSelector.Body).Member;

                var colLabelPType = (PropertyInfo)colLabelInfo;
                if (colLabelPType.PropertyType != typeof(string))
                {
                    throw new Exception("colNameSelector表达式错误,类型必须是string");
                }

                colLabelName = colLabelInfo.Name;
            }
            else
            {
                throw new Exception("colNameSelector表达式错误,需要colNameSelector.Body is MemberExpression判断成立");
            }




            var colNames = new List<string>();
            if (colSelector.Body is MemberExpression)
            {
                colNames.Add(((MemberExpression)colSelector.Body).Member.Name);
            }
            else
            {
                colNames.AddRange(((NewExpression)colSelector.Body).Arguments.Select(it => it as MemberExpression).Select(it => it.Member.Name));
            }

            var tType = typeof(T);
            var tProperties = tType.GetProperties();
            tProperties = tProperties.Where(x => colNames.Contains(x.Name)).ToArray();

            var rowType = typeof(TRow);
            var tDataPropert = rowType.GetProperty(tDataName);
            var colLabePropert = rowType.GetProperty(colLabelName);


            foreach (var data in dataList)
            {
                foreach (var tProperty in tProperties)
                {
                    var row = rowSelector(data);
                    tDataPropert.SetValue(row, tProperty.GetValue(data));
                    colLabePropert.SetValue(row, tProperty.Name);
                    resList.Add(row);
                }
            }


            return resList;
        }

        public static List<TRow> ToUnPivotList<T, TRow, TCol, TColName, TData>(
            this ISugarQueryable<T> queryable,
            Func<T, TRow> rowSelector,
            Expression<Func<TRow, TData>> dataSelector,
            Expression<Func<T, TCol>> colSelector)
        {
            var dataList = queryable.ToList();
            var resList = new List<TRow>();

            var tDataName = string.Empty;
            if (dataSelector.Body is MemberExpression)
            {
                tDataName = ((MemberExpression)dataSelector.Body).Member.Name;
            }
            else
            {
                throw new Exception("dataSelector表达式错误,需要dataSelector.Body is MemberExpression判断成立");
            }
            




            var colNames = new List<string>();
            if (colSelector.Body is MemberExpression)
            {
                colNames.Add(((MemberExpression)colSelector.Body).Member.Name);
            }
            else
            {
                colNames.AddRange(((NewExpression)colSelector.Body).Arguments.Select(it => it as MemberExpression).Select(it => it.Member.Name));
            }

            var tType = typeof(T);
            var tProperties = tType.GetProperties();
            tProperties = tProperties.Where(x => colNames.Contains(x.Name)).ToArray();

            var rowType = typeof(TRow);
            var tDataPropert = rowType.GetProperty(tDataName);
            

            foreach (var data in dataList)
            {
                foreach (var tProperty in tProperties)
                {
                    var row = rowSelector(data);
                    tDataPropert.SetValue(row, tProperty.GetValue(data));
                    
                    resList.Add(row);
                }
            }


            return resList;
        }
    }
点击查看代码-使用方式
var resList = sql.ToUnPivotList(
                (it) => new DeptAmountData()
                {
                    salerId = it.F_PAEZ_XSY01,
                    dateStrYear = it.F_BGP_ND,
                    deptId = it.deptId,
                    salerName = it.salerName,
                    salerStaffId = it.salerStaffId
                }
                , itr => itr.amount
                , itr => itr.amountLabel
                , it => new
                {
                    it.F_PAEZ_MBZ_01,
                    it.F_PAEZ_MBZ_02,
                    it.F_PAEZ_MBZ_03,
                    it.F_PAEZ_MBZ_04,
                    it.F_PAEZ_MBZ_05,
                    it.F_PAEZ_MBZ_06,
                    it.F_PAEZ_MBZ_07,
                    it.F_PAEZ_MBZ_08,
                    it.F_PAEZ_MBZ_09,
                    it.F_PAEZ_MBZ_10,
                    it.F_PAEZ_MBZ_11,
                    it.F_PAEZ_MBZ_12
                });

标签:MemberExpression,Body,转行,扩展,MBZ,var,new,PAEZ,SqlSugar
From: https://www.cnblogs.com/hbdh/p/17458081.html

相关文章

  • mybatis-plus扩展extend批量操作(自带批量操作是循环单条插入,效率太低)
    目录添加依赖构建三个配置-推荐放一个包里面让原本继承BaseMapper<实体>的Dao层改为继承EasyBaseMapper<实体>service层已经可以使用批量操作了 添加依赖<!--mybatis-plus组件--><dependency><groupId>com.baomidou</groupId><artifactId>myba......
  • ORM核心功能之导航属性- EFCore和 SqlSugar
    导航属性导航属性是作为ORM核心功能中的核心,在SqlSugar没有支持导航属性前,都说只是一个高级DbHelper,经过3年的SqlSugar重构已经拥有了一套非常成熟的导航属性体系,本文不是重点讲SqlSugar而是重点讲导航属性的作用,让更多写Sql人还未使用ORM的人了解到ORM的作用。 1.复杂的查......
  • ORA-30036: 无法按8扩展段(在还原表空间‘UNDOTBS1‘中 ,数据泵导入错误
       在ORACLE数据库进行数据泵定时任务导入是:出现错误:ORA-30036:无法按8扩展段(在还原表空间‘UNDOTBS1‘中   经过查询:UNDOTBS1表空间超过最大值,想扩大表空间   但在增大表空间的时候提示错误:ora-01537无法添加文件该文件已是数据库的一部分   只......
  • ChunJun FTP Connector 功能扩展解读
    本文将从FTPConnector的功能详解,自定义文件切割及自定义FileFormat三个方面为大家带来ChunJunFTPConnector的功能扩展分享。FTPConnector详解FTP是用于在网络上进行文件传输的一套标准协议,它工作在OSI模型的第七层,TCP模型的第四层,即应用层,提供一种在服务器和客户......
  • (ex)BSGS/(扩展)大步小步算法 学习笔记
    (ex)BSGS/(扩展)大步小步算法学习笔记在即将暂时退役之际杀掉了P4195的毒瘤模板题,于是来写篇学习笔记。谨此为我初中三年摆烂的OI生涯画上一个句号。(距离中考还有20天!)BSGSlink求\(a^x\equivb\pmodp\)的非负整数解,其中\(a,p\)互质。算法思路我们不妨令\(t=\lceil{\sqrt{p}......
  • 为Ant开发扩展任务
    [url]http://lujar.iteye.com/blog/154490[/url][b]第二篇调试文章,会说出第一篇文章的不足,并提供更好的方式。[/b][b]两种方式[/b]为Ant实现扩展任务其实是非常容易的,只需按照以下几个步骤即可:1.创建一个Java类继承org.apache.tools.ant.Task类;2.对每个属性实现set方法。Ant......
  • 【1对1咨询】前端和后端,哪个更简单?转行程序员的捷径
    大家好,这里是程序员晚枫,专注于转行程序员的1对1咨询,小红薯也叫这个名。想转行程序员的朋友,在选择方向的时候都会遇到一个问题:哪个技术方向适合我?前端和后端哪个更简单?今天咱们就来一起分析一下~1、一样难很多网上的消息或者培训机构的广告会告诉你:前端比后端简单。这种回复,更多......
  • 基于SqlSugar的开发框架循序渐进介绍(30)-- 整合客户关系管理系统模块功能
    以前在随笔《Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示 》的几篇随笔中介绍过基于WInform开发框架开发的CRM系统,系统的功能主要也是围绕着客户相关信息来进行管理的,经过一些客户的定制应用,以及框架各种功能的完善,系统也已经很完善了,不过不同的CRM侧重......
  • Spark3.x扩展内容
    3.0.0主要的新特性:在TPC-DS基准测试中,通过启用自适应查询执行、动态分区裁剪等其他优化措施,相比于Spark2.4,性能提升了2倍兼容ANSISQL对pandasAPI的重大改进,包括python类型hints及其他的pandasUDFs简化了Pyspark异常,更好的处理Pythonerrorstructuredstreaming的新UI在......
  • Linux 编译安装 php 扩展 amqp
    这里最大的坑,就是  rabbitmq-c和amqp扩展版本不符,导致的各种bug。其他也没啥,这里简单记录下:我这里使用的环境:php7.4  、rabbitmq-c0.7.1、amqp1.9.4. 安装rabbitmq-c(注意记住你的安装位置,下一步要用)wgethttps://github.com/alanxz/rabbitmq-c/releases/download......