当前位置: 首页 > news >正文

DataTableResponseEntity

 /// <summary>/// DataTable数据集合返回实体/// </summary>[Serializable]public sealed class DataTableResponseEntity : IResponse{private readonly DataTable sourceTable;private readonly int PageCount;private readonly int totalCount;private readonly Dictionary<string, Tuple<Type, string, Func<object, object>>> addValuePairs = new Dictionary<string, Tuple<Type, string, Func<object, object>>>();private readonly Dictionary<string, string> removeValuePairs = new Dictionary<string, string>();private readonly Dictionary<string, Tuple<Type, string, Func<object, object>>> editValuePairs = new Dictionary<string, Tuple<Type, string, Func<object, object>>>();/// <summary>/// 构造函数/// </summary>public DataTableResponseEntity(DataTable dataTable): this(dataTable, dataTable.Rows.Count){}/// <summary>/// 构造函数/// </summary>public DataTableResponseEntity(DataTable dataTable, int totalCount){this.sourceTable = dataTable;this.PageCount = dataTable.Rows.Count;this.totalCount = totalCount;}/// <summary>/// 获取总数/// </summary>public int TotalCount { get { return this.totalCount; } }/// <summary>/// 是否包含行/// </summary>public bool HasRows{get { return this.PageCount > 0; }}/// <summary>/// /// </summary>public int RowsCount { get { return this.sourceTable.Rows.Count; } }/// <summary>/// 获取字段的值/// </summary>/// <returns></returns>public T SafeRead<T>(int rows, string fieldName){if (rows < 0 || rows > this.PageCount)return default;var dataRow = this.sourceTable.Rows[rows];if (this.sourceTable.Columns.Contains(fieldName) == false || Convert.IsDBNull(dataRow[fieldName]))return default;if (this.sourceTable.Columns[fieldName].DataType != typeof(T))return (T)Convert.ChangeType(dataRow[fieldName], typeof(T));return dataRow.Field<T>(fieldName);}/// <summary>/// 获取字段的值/// </summary>/// <returns></returns>public T SafeRead<T>(int rows, string fieldName, Func<object, T> funValue){if (rows < 0 || rows > this.PageCount)return default;var dataRow = this.sourceTable.Rows[rows];if (this.sourceTable.Columns.Contains(fieldName) == false || Convert.IsDBNull(dataRow[fieldName]))return funValue.Invoke(null);if (this.sourceTable.Columns[fieldName].DataType != typeof(T))return funValue.Invoke(dataRow[fieldName]);return funValue.Invoke(dataRow.Field<T>(fieldName));}/// <summary>/// 获取字段的值/// </summary>/// <returns></returns>public void SafeWrite<T>(int rows, string fieldName, T writeValue, bool isThrow = false){if (rows < 0 || rows > this.PageCount)return;var dataRow = this.sourceTable.Rows[rows];if (this.sourceTable.Columns.Contains(fieldName) == false){if (isThrow)return;this.sourceTable.Columns.Add(fieldName, typeof(T));dataRow.SetField<T>(fieldName, writeValue);return;}if (this.sourceTable.Columns[fieldName].DataType != typeof(T)){object newValue = Convert.ChangeType(writeValue, this.sourceTable.Columns[fieldName].DataType);dataRow[fieldName] = newValue;return;}dataRow.SetField<T>(fieldName, writeValue);}/// <summary>/// 获取字段的值/// </summary>/// <returns></returns>public T SafeRead<T>(int rows, string fieldName, T defualtValue){if (rows < 0 || rows > this.PageCount)return default;var dataRow = this.sourceTable.Rows[rows];if (this.sourceTable.Columns.Contains(fieldName) == false || Convert.IsDBNull(dataRow[fieldName]))return defualtValue;if (this.sourceTable.Columns[fieldName].DataType != typeof(T))return defualtValue;return dataRow.Field<T>(fieldName);}/// <summary>/// 获取字段的值/// </summary>/// <returns></returns>public T SafeRead<T>(DataRow dataRow, string fieldName, Func<object, DataColumn, T> funValue){if (this.sourceTable.Columns.Contains(fieldName) == false || Convert.IsDBNull(dataRow[fieldName]))return funValue.Invoke(null, null);if (this.sourceTable.Columns[fieldName].DataType != typeof(T))return funValue.Invoke(dataRow[fieldName], this.sourceTable.Columns[fieldName]);return funValue.Invoke(dataRow.Field<T>(fieldName), this.sourceTable.Columns[fieldName]);}/// <summary>/// /// </summary>/// <typeparam name="T"></typeparam>/// <param name="ExecuteTask"></param>public T DoWhile<T>(Func<DataTableResponseEntity, T> ExecuteTask){return ExecuteTask.Invoke(this);}/// <summary>/// /// </summary>/// <returns></returns>public EnumerableRowCollection<DataRow> AsEnumerable(){return this.sourceTable.AsEnumerable();}private bool ColumnEqual(object objectA, object objectB){if (objectA == DBNull.Value && objectB == DBNull.Value)return true;if (objectA == DBNull.Value || objectB == DBNull.Value)return false;return (objectA.Equals(objectB));}private bool RowEqual(DataRow rowA, DataRow rowB, DataColumnCollection columns){bool result = true;for (int i = 0; i < columns.Count; i++)result &= ColumnEqual(rowA[columns[i].ColumnName], rowB[columns[i].ColumnName]);return result;}/// <summary> /// 按照fieldName从sourceTable中选择出不重复的行, /// 相当于select distinct fieldName1,fieldName2,,fieldNamen from sourceTable /// </summary> /// <param name="filterExpression"></param> /// <param name="fieldNames">列名数组</param> /// <returns>一个新的不含重复行的DataTable,列只包括fieldNames中指明的列</returns> public DataTableResponseEntity Split(string filterExpression, string[] fieldNames = null){DataTable resultTable = new DataTable();foreach (var field in fieldNames){if (string.IsNullOrEmpty(field) || resultTable.Columns.Contains(field))continue;resultTable.Columns.Add(field, this.sourceTable.Columns[field].DataType);}object[] values = new object[fieldNames.Length];DataRow lastRow = null;foreach (DataRow dr in this.sourceTable.Select(filterExpression, string.Empty)){if (lastRow == null || !(RowEqual(lastRow, dr, resultTable.Columns))){lastRow = dr;for (int i = 0; i < fieldNames.Length; i++)values[i] = dr[fieldNames[i]];resultTable.Rows.Add(values);}}return new DataTableResponseEntity(resultTable);}/// <summary>/// /// </summary>/// <returns></returns>public DataTable AsTable(){RemoveTableColumn();AddTableColumn();EditTableColumn();return this.sourceTable;}/// <summary>/// /// </summary>/// <returns></returns>public string AsTableJson(){return JsonConvert.SerializeObject(this.sourceTable);}/// <summary>/// 获取列名称/// </summary>public IEnumerable<string> Columns{get{foreach (DataColumn dc in this.sourceTable.Columns)yield return dc.ColumnName;}}/// <summary>/// 获取列/// </summary>public IEnumerable<DataColumn> DataColumns{get{foreach (DataColumn dc in this.sourceTable.Columns)yield return dc;}}/// <summary>/// 新增列/// </summary>/// <returns></returns>public DataTableResponseEntity AddColumn(string newColumnName, Type newColumnType, object newColumnValue){return this.AddColumn(newColumnName, newColumnType, string.Empty, (originalValue) => newColumnValue);}/// <summary>/// 新增列/// </summary>/// <returns></returns>public DataTableResponseEntity AddColumn(string newColumnName, Type newColumnType, Func<object, object> valueFrom){return this.AddColumn(newColumnName, newColumnType, string.Empty, valueFrom);}/// <summary>/// 新增列/// </summary>/// <returns></returns>public DataTableResponseEntity AddColumn(bool isAdd, string newColumnName, Type newColumnType, Func<object, object> valueFrom){if (isAdd == false)return this;return this.AddColumn(newColumnName, newColumnType, string.Empty, valueFrom);}/// <summary>/// 新增列/// </summary>/// <returns></returns>public DataTableResponseEntity AddColumn(string newColumnName, Type newColumnType, string originalColumnName, Func<object, object> valueFrom){this.addValuePairs.TryAdd(newColumnName, Tuple.Create(newColumnType, originalColumnName, valueFrom));return this;}/// <summary>/// 新增字段/// </summary>private void AddTableColumn(){if (this.sourceTable == null || this.sourceTable.Rows.Count <= 0 || addValuePairs == null || addValuePairs.Count <= 0)return;foreach (var newCol in addValuePairs){if (this.sourceTable.Columns.Contains(newCol.Key))continue;if (newCol.Value.Item1 != null)this.sourceTable.Columns.Add(newCol.Key, newCol.Value.Item1);elsethis.sourceTable.Columns.Add(newCol.Key);}foreach (DataRow currentRow in this.sourceTable.Rows){foreach (var newCol in addValuePairs){var newValue = newCol.Value.Item3?.Invoke(!string.IsNullOrEmpty(newCol.Value.Item2) ? currentRow[newCol.Value.Item2] : null);currentRow.SetField(newCol.Key, newValue);}}}/// <summary>/// 删除列/// </summary>/// <returns></returns>public DataTableResponseEntity RemoveColumn(string newColumnName){this.removeValuePairs.TryAdd(newColumnName, newColumnName);return this;}/// <summary>/// 删除字段/// </summary>private void RemoveTableColumn(){if (this.sourceTable == null || this.sourceTable.Rows.Count <= 0 || this.removeValuePairs == null || this.removeValuePairs.Count <= 0)return;foreach (var newCol in removeValuePairs){if (this.sourceTable.Columns.Contains(newCol.Key))this.sourceTable.Columns.Remove(newCol.Key);}}/// <summary>/// 修改列/// </summary>/// <returns></returns>public DataTableResponseEntity EditColumn(string newColumnName, Type newColumnType, string originalColumnName, Func<object, object> valueFrom = null){this.editValuePairs.TryAdd(newColumnName, Tuple.Create(newColumnType, originalColumnName, valueFrom));return this;}/// <summary>/// 修改字段/// </summary>private void EditTableColumn(){if (this.sourceTable == null || this.sourceTable.Rows.Count <= 0 || this.editValuePairs == null || this.editValuePairs.Count <= 0)return;//新增需要的 Where(t => this.currentTable.Columns[t.Value.Item2].DataType != t.Value.Item1)Dictionary<string, Tuple<string, Type>> mayAddCols = editValuePairs.ToDictionary<KeyValuePair<string, Tuple<Type, string, Func<object, object>>>, string, Tuple<string, Type>>(keySelector: (keyPairItem) => keyPairItem.Key, elementSelector: (keyPairItem) => Tuple.Create(keyPairItem.Value.Item2, keyPairItem.Value.Item1));//editValuePairs KEY:新字段,Value:新类型,旧字段,值转换Func//mayAddCols     KEY:新字段,Value:旧字段,新类型foreach (var ss in mayAddCols){if (!this.sourceTable.Columns.Contains(ss.Key))this.sourceTable.Columns.Add(ss.Key, ss.Value.Item2);foreach (DataRow currentRow in this.sourceTable.Rows){var newValue = currentRow[ss.Value.Item1];var editValue = editValuePairs.FirstOrDefault(y => y.Key == ss.Key);if (!string.IsNullOrEmpty(editValue.Key) && editValue.Value.Item3 != null)newValue = editValue.Value.Item3.Invoke(newValue);//设置到新列上currentRow.SetField(ss.Key, newValue);}}//避免多个新字段 取到同个旧字段的值foreach (var ss in mayAddCols){if (this.sourceTable.Columns.Contains(ss.Value.Item1) && !ss.Value.Item1.Equals(ss.Key, StringComparison.OrdinalIgnoreCase))this.sourceTable.Columns.Remove(ss.Value.Item1);}}}

使用:

 var currTable = dataTableResponseEntity.EditColumn("RowNo", typeof(Int64), "FSEQ", t => t).EditColumn("MaterialCode", typeof(string), "FItemNumber", t => t.ToString()).EditColumn("Qty", typeof(decimal), "FQTY", t => t).EditColumn("ErpId", typeof(string), "FID", t => t.ToString()).EditColumn("ErpSubId", typeof(string), "FEntryID", t => t.ToString());

相关文章:

DataTableResponseEntity

/// <summary>/// DataTable数据集合返回实体/// </summary>[Serializable]public sealed class DataTableResponseEntity : IResponse{private readonly DataTable sourceTable;private readonly int PageCount;private readonly int totalCount;private readonly…...

Python爬虫(十八)_多线程糗事百科案例

多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:https://cloud.tencent.com/developer/article/1021994 Queue(队列对象) Queue是python中的标准库&#xff0c;可以直接import Queue引用&#xff1b;队列时线程间最常用的交互数据的形式。 python下多线程的思考…...

无穷级数重要知识点

部分和 s ∑ i 1 n u i s \sum_{i1}^{n} u _{i} si1∑n​ui​ 注意&#xff1a;部分和不是数列的一部分之和&#xff0c;而是一个极限的概念&#xff0c;此处的n是一个极限值&#xff0c; n 趋于正无穷&#xff01; \color{red}n趋于正无穷&#xff01; n趋于正无穷&#x…...

【MyBatis】快速入门

1、简介 MyBatis是一个持久化、轻量级的半自动化ORM框架&#xff0c;封装了所有JDBC的原始操作。查询参数以及获取结果集等。 1.1 原始JDBC操作存在的问题 &#xff08;1&#xff09;数据库连接、释放频繁造成系统资源浪费&#xff0c;影响系统性能 &#xff08;2&#xff09;…...

【gtpJavaScript】使用JavaScript实现套壳gtp与gtp打字输出效果

postman测试gtp接口 https://platform.openai.com/docs/api-reference/chat/create?langcurl 导入到postman中 记得弄一个gtp的key 然后请求测试gtp接口&#xff1a; 纯前端实现gtp请求页面 目录结构&#xff1a; 部分参考&#xff1a;GitHub - xxxjkk/chat-website: 简易版c…...

C++内存管理(2)new、delete详解

目录 new operator&#xff08;new操作&#xff09; new类对象时加不加括号的差别 new工作任务 delete工作任务 new和delete 堆区空间操作&#xff08;对比malloc和free&#xff09; new和delete操作基本类型的空间 new和delete操作基本类型的数组 new和delete操作类的…...

ELK集群搭建流程(实践可用)

一、概述 ELK 是一个由三个开源软件工具组成的数据处理和可视化平台&#xff0c;包括 Elasticsearch、Logstash 和 Kibana。这些工具都是由 Elastic 公司创建和维护的。 Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;可以将大量数据存储在一个或多个节点上&#xf…...

react-quill富文本 中文输入法触发change问题

使用的富文本是编辑器 react-quill 需求&#xff1a; 点击按钮插入自定义颜色文字&#xff0c;然后手动输入为正常颜色。 问题&#xff1a; quill组件把带颜色的字体创建个dom, 临近的文字都会整合进一个dom中&#xff0c;导致输入的文字和插入的带颜色 都统一成一个颜色了…...

Upload-labs 1~15 通关详细教程

文章目录 Upload-labs 1~15 通关详细教程Pass-01-前端js验证Pass-02-后端MIME验证Pass-03-黑名单验证Pass-04-黑名单验证.htaccessPass-05-文件后缀名大小写绕过Pass-06-文件后缀名空格绕过Pass-07-文件后缀名点绕过Pass-08-文件后缀名::$DATA绕过Pass-09-点空格点空格绕过Pass…...

ChatGPT分析日本排放核污水对世界的影响

文章目录 1 背景2 环境影响3 健康影响4 国际关系影响5 应对措施 近段时间被日本排放核污水到海里的消息刷屏了&#xff0c;这一举措引发了广泛的关注和担忧。本文结合ChatGPT来分析这件事的前因后果、会对世界造成的影响、以及应对措施。 1 背景 受2011年发生的大地震及海啸影响…...

eclipse进入断点之后,一直卡死,线程一直在运行【记录一种情况】

问题描述: 一直卡死在某个断点处&#xff0c;取消断点也是卡死在这边的进程处。 解决方式&#xff1a; 将JDK的使用内存进行了修改 ① 打开eclipse&#xff0c;window->preference->Java->Installed JREs&#xff0c;选中使用的jdk然后点击右侧的edit&#xff0c;在…...

2.5 动态字符串 String (完整源码)

C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 本文的实现基本上和 动态数组 vector 是一样的。 因为大部分接口都一样。 所以&#xff0c;本文就直接给出全部的源码和运行结果。 //------下面的代码是用来测试你的代码有没有问题的辅助代码…...

Ansible之变量

一&#xff09;Ansible变量介绍 我们在PlayBook⼀节中&#xff0c;将PlayBook类⽐成了Linux中的shell。 那么它作为⼀⻔Ansible特殊的语⾔&#xff0c;肯定要涉及到变量定义、控 制结构的使⽤等特性。 在这⼀节中主要讨论变量的定义和使⽤ 二&#xff09;变量命名规则 变量的…...

自动化测试面试常见技术题目

1&#xff1a;一行代码实现1--100之和 print(sum(list(range(1,101)))) 2&#xff1a;如何在一个函数内部修改全局变量 global  修改全局变量 局部作用域只能调用全局作用域的变量&#xff0c;但是不熊修改全局作用域的变量&#xff0c;如果想要修改全局作用域的变量需要gl…...

aarch64 arm64 部署 stable diffusion webui 笔记 【2】继续安装其他依赖 gfpgan

接上篇 aarch64 arm64 部署 stable diffusion webui 笔记 【1】准备 venv 安装pytorch 验证cuda_hkNaruto的博客-CSDN博客 编辑requirements_versions.txt&#xff0c;注释掉torch 启动webui.sh (venv) [rootceph3 stable-diffusion-webui]# useradd yeqiang useradd&#xf…...

使用ECS和RDS部署WordPress,搭建个人博客并使用域名访问

目录 一、准备工作 1、准备ECS服务器 2、创建数据库账号和密码 二、部署环境 1、远程连接 2、安装Apache服务 3、部署WordPress 三、对博客的优化并使用域名访问 1、博客的设计优化 1.1 插件的使用 1.2 博客的设计介绍 2、使用域名访问 四、个人博客部署的心得 1…...

C# Winform 简单排期实现(DevExpress TreeList)

排期的需求在很多任务安排的系统中都有相应的需求&#xff0c;原生的Winform控件并未提供相应的控件&#xff0c;一般都是利用DataGridViewTreeView组合完成相应的需求&#xff0c;实现起来比较麻烦。用过DevExpress控件集的开发者应该知道&#xff0c;DevExpress WinForm提供了…...

2023高教社杯国赛数学建模C题思路+模型+代码(9.7晚开赛后第一时间更新)

目录 1.C题思路模型&#xff1a;9.7晚上比赛开始后&#xff0c;第一时间更新&#xff0c;获取见文末名片 2.竞赛注意事项&#xff1a;包括比赛流程&#xff0c;任务分配&#xff0c;时间把控&#xff0c;论文润色&#xff0c;已经发布在文末名片中 3.常用国赛数学建模算法 …...

QT6中添加串口模块SerialPort最简单方法

qt6.2.3以上版本已经开始支持SerialPort包了&#xff0c;不用在傻傻的自己去编译包了。 在安装的时候勾选SerialPort即可。 等着安装完即可。 如果已经安装完了的小伙伴&#xff0c;可以用 从新打开维护 选择增加或者删除组件 即可从新选择组件...

LeetCode每日一题:1123. 最深叶节点的最近公共祖先(2023.9.6 C++)

目录 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 给你一个有根节点 root 的二叉树&#xff0c;返回它 最深的叶节点的最近公共祖先 。 回想一下&…...

Oracle查看锁表和正在执行的Sql

查看当前被锁的表&#xff08;需要有管理员权限&#xff09;&#xff1a; --查看锁表进程SQL语句1&#xff1a; select sess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_modefrom v$locked_object lo, dba_objects ao, v$session sesswh…...

Linux centos 卸载 ceph

在CentOS上卸载Ceph的操作步骤&#xff1a; 1. 停止Ceph集群&#xff1a;首先&#xff0c;你需要停止Ceph集群中的所有服务。在每个节点上运行以下命令来停止所有服务 systemctl stop ceph.target 2. 卸载Ceph软件包&#xff1a;在每个节点上&#xff0c;使用yum包管理器卸载C…...

ElementUI浅尝辄止34:Radio 单选框

在一组备选项中进行单选 1.如何使用&#xff1f; 由于选项默认可见&#xff0c;不宜过多&#xff0c;若选项过多&#xff0c;建议使用 Select 选择器。 //要使用 Radio 组件&#xff0c;只需要设置v-model绑定变量&#xff0c;选中意味着变量的值为相应 Radio label属性的值&…...

开始MySQL之路——MySQL三大日志(binlog、redo log和undo log)概述详解

前言 MySQL实现事务、崩溃恢复、集群的主从复制&#xff0c;底层都离不开日志&#xff0c;所以日志是MySQL的精华所在。只有了解MySQL日志&#xff0c;才算是彻底搞懂MySQL。 日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包…...

router基础使用

1.安装router npm i vue-router3 安装后 2.写出路由界面 接着 3.配置路由 import Vue from vue import VueRouter from vue-router import Home from "../views/Home.vue" import About from "../views/About.vue" Vue.use(VueRouter)const routes …...

亚马逊云科技人工智能内容审核服务:大大降低生成不安全内容的风险

生成式人工智能技术发展日新月异&#xff0c;现在已经能够根据文本输入生成文本和图像。Stable Diffusion是一种文本转图像模型&#xff0c;可以创建栩栩如生的图像应用。通过Amazon SageMaker JumpStart&#xff0c;使用Stable Diffusion模型轻松地从文本生成图像。 尽管生成式…...

2023年高教社杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…...

算法工程题(二叉树递归)

* 题意说明&#xff1a; * 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 * 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 * * 示例 1&#xff1a; * 输入&#xff1a;p [1,2,3]…...

“指针跃动”受邀参加全球贸易服务峰会

“指针跃动”受邀参加全球贸易服务峰会 有“服”同享 共赢未来 引子 在全球化日益盛行的今天&#xff0c;贸易不再仅仅是物质的交流&#xff0c;更涉及到服务、理念、文化和科技的共享。中国国际服务贸易交易会全球贸易服务峰会&#xff0c;就是这个趋势的集中体现。在这次峰会…...

Go Web开发的高级技巧和最佳实践

Go Web开发的高级技巧和最佳实践 欢迎来到Go语言Web开发的高级技巧和最佳实践指南。在这篇文章中&#xff0c;我们将深入探讨Go语言Web应用程序的高级主题&#xff0c;包括性能优化、安全性、部署和微服务架构。 性能优化 性能是Web应用程序的关键因素之一。Go语言以其出色的…...