Table 类(数据表基类)
只修改数据表某条记录的部分字段(究极进化):
public class TableHelper
{
private Dictionary<string, object> temp;
public Dictionary<string, object> Temp { get { return temp; } } private SqlSugarClient db;
private HttpContext context;
public TableHelper(SqlSugarClient db)
{
this.db = db;
}
public TableHelper(SqlSugarClient db, HttpContext context)
{
this.db = db;
this.context = context;
} /// <summary>
/// 将对象类型的json数据转换成字典
/// </summary>
/// <typeparam name="T">数据表的模型类</typeparam>
/// <param name="data">json数据</param>
public void ToDictionary<T>(string data) where T : class
{
temp = new Dictionary<string, object>(); //重新实例化对象 T tableobj = JsonConvert.DeserializeObject<T>(data); //先反序列化
Type t = tableobj.GetType(); //获取对象的类型 foreach (PropertyInfo pi in t.GetProperties()) //遍历数据表对象的属性,将属性名和属性值存进字典里
{
if (pi.Name == "id")
{ }
else
{
Object value = pi.GetValue(tableobj);
if (value != null)
{
temp.Add(pi.Name, pi.GetValue(tableobj));
}
}
}
} /// <summary>
/// 额外添加要修改的字段(如果转换来的对象中已经存在该字段则不添加)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void AddField(string key,object value)
{
foreach (string s in temp.Keys)
{
if (s == key)
{
}
else
{
temp.Add(key, value);
}
}
} public bool Update<T>(Dictionary<string, object> tableobj, int rowId) where T : class
{
return db.Update<T, int>(tableobj, rowId);
}
}
以下是以前写的(还是上边的写的更好):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using Newtonsoft.Json;
using SqlSugar;
using EQD.variable; namespace EQD.variable
{
/// <summary>
/// 这是一个数据表的基类,但要使用的前提是其他数据表要继承于它
/// </summary>
public class Table
{
private SqlSugarClient db = new SqlSugarClient(DBHelper.connectionString);
//public SqlSugarClient DB { get; set; } /// <summary>
/// 反序列化一下
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static Table DeserializeObject(string data)
{
Table table = new Table();
try
{
table = JsonConvert.DeserializeObject<Table>(data); //将要修改的内容全部转换成 dt
}
catch
{
}
return table;
} /// <summary>
/// 这是修改之后的更新方法(tableobj:反序列化之后包含要修改的内容的对象。contactsid:要修改的数据记录的id)
/// </summary>
/// <param name="tableobj">反序列化之后包含要修改的内容的对象</param>
/// <param name="contactsid">要修改的数据记录的id</param>
/// <returns></returns>
public bool Alter1(Table tableobj, int contactsid)
{
#region 将反序列化的对象中要修改的属性转换成字典集合
List<string> namelist = new List<string>();
List<Object> valuelist = new List<object>(); Type t = tableobj.GetType(); //获取对象的类型
foreach (PropertyInfo pi in t.GetProperties()) //遍历数据表对象的属性,分别将属性名和属性值存进两个集合里面
{
if (pi.Name == "id")
{ }
else
{
Object value = pi.GetValue(tableobj);
if (value != null)
{
namelist.Add(pi.Name);
valuelist.Add(value);
}
}
} Dictionary<string, object> temp = new Dictionary<string, object>(); for (int i = ; i < namelist.Count; i++)
{
temp.Add(namelist[i], valuelist[i]);
}
temp.Add("updateTime", DateTime.Now);
#endregion
bool result = db.Update<Table, int>(temp, contactsid); return result;
} #region 以下是原来写的内容
/// <summary>
/// 修改数据表中某条数据的内容
/// </summary>
/// <param name="tableobj">数据表的对象——一条数据</param>
/// <returns></returns>
public static Object Alter(Table tableobj)
{
List<string> namelist = new List<string>();
List<Object> valuelist = new List<object>(); Type t = tableobj.GetType(); //获取对象的类型
foreach (PropertyInfo pi in t.GetProperties()) //遍历数据表对象的属性,分别将属性名和属性值存进两个集合里面
{
if (pi.Name == "id")
{ }
else
{
Object value = pi.GetValue(tableobj);
if (value != null)
{
namelist.Add(pi.Name);
valuelist.Add(value);
}
}
} Dictionary<string, object> temp = new Dictionary<string, object>(); for (int i = ; i < namelist.Count; i++)
{
temp.Add(namelist[i], valuelist[i]);
}
temp.Add("updateTime", DateTime.Now);
return temp;
} //方法重载,只有第二个参数里包含的字段才能进行修改
public static Object AlterDate(Object tabledataobj, List<string> modifiableField)
{
List<string> namelist = new List<string>();
List<Object> valuelist = new List<object>(); Type t = tabledataobj.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
if (pi.Name == "id")
{ }
else
{
if (modifiableField.Contains(pi.Name))
{
Object value = pi.GetValue(tabledataobj);
if (value != null)
{
namelist.Add(pi.Name);
valuelist.Add(value);
}
}
}
} Dictionary<string, object> temp = new Dictionary<string, object>(); for (int i = ; i < namelist.Count; i++)
{
temp.Add(namelist[i], valuelist[i]);
}
temp.Add("updateTime", DateTime.Now);
return temp;
}
#endregion
}
}
调用:
//要传入的参数
string owner = context.Request.Form["owner"]; //修改人
int contactsid = Convert.ToInt32(context.Request.Form["contactsid"]); //要修改的联系人的id
//要修改的信息
string data = context.Request.Form["data"]; //这是一条json数据字符串,里面包含了要修改的信息的内容 Table table = new t_user();
table = Table.DeserializeObject(data); //如果传入的数据不对,则返回的 table 对象的属性全部为 null using (var db = new SqlSugarClient(DBHelper.connectionString))
{
try
{
var result = table.Alter1(table, contactsid);
}
catch (Exception e)
{ }
}
对于原来的代码里其实还是有一些很好的东西,比如动态生成对象且动态增加属性。但对于这个类,因为 SqlSuger 其实有对应的只修改某些列的方法,所以以上的代码还可以再调整,进行优化。
只数据部分字段:
var result = db.Queryable<t_user>().Where(u => u.CompanyId == comid && u.Isdel == false).OrderBy(u => u.addTime, OrderByType.Desc).ToPageList(page + , ); //先全部查出来,然后再用 tuple
List<Tuple<int, DateTime?>> list = new List<Tuple<int, DateTime?>>();
foreach (t_user u in result)
{
list.Add(new Tuple<int, DateTime?>(u.id,u.addTime));
}
Table 类(数据表基类)的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...
- mysql批量插入数据的基类
自己设计的一个mysql数据库批量添加数据的基类.用于批量向mysql数据库添加数据,子类实现起来很简单,自测性能也还不错. 1.基类实现-BatchAddBase using System.Coll ...
- BIM工程信息管理系统-EF实体框架数据操作基类
EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++//菱形继承 //俩个派生类继承同一个基类 //又有某个类同时继承俩个派生类 //成为 菱形继承 或者 钻石 继承//+解决
1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...
- 派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good
大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...
- 【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法
现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. ...
- C++ - 派生类访问模板基类(templatized base class)命名
派生类访问模板基类(templatized base class)命名 本文地址: http://blog.csdn.net/caroline_wendy/article/details/239936 ...
- laravel5.8笔记五:基类控制器和基类模型
建立基类的目的就是为了方便继承.比如:Admin模块访问,是否登陆.检测登陆可以写到基类里面 控制器基类 原始基类:app\Http\Controllers\Controller.php,我们下面要做 ...
随机推荐
- mysql查看所有触发器以及存储过程等操作集合
今天在做每个月定时扣费的功能 用到了Mysql的Event Scheduler 昨完之后发现一个问题 Event Scheduler 默认是不开启的 要在mysql内执行SET GLOBAL even ...
- ASP.NET Core WebApi使用Swagger生成api
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
- SNMP理解
前两天项目要求一个附加功能,远程监视服务器的运行状况,要定期监视指定端口,指定业务,还包括服务器的磁盘空间,内存,CPU使用率等等.这头俩事还好说,ping和telnet也就搞定了,实在不行就开个so ...
- 如何在Linux 中获取硬盘分区或文件系统的UUID?
作为一个 Linux 系统管理员,你应该知道如何去查看分区的 UUID 或文件系统的 UUID.因为现在大多数的 Linux 系统都使用 UUID 挂载分区.你可以在 /etc/fstab 文件中可以 ...
- js中的排序方法
一.冒泡排序 var arr=[22,1,33,19,77]; function bubbleSort(arr){ for(var i=0;i<arr.length-1;i++){ for( ...
- JZ2440学习笔记之链接文件lds
如果在Linux环境下用arm-linux-gcc来编译arm程序,需要编写链接文件lds: 1. 运行地址=链接地址,表示代码在SDRAM中执行的地址,如果程序中有对某部分代码执行过搬运,需要在ld ...
- 网易cetus数据库中间件安装-读写分离版本
安装前提:1.数据库主从关系要做好:2.授权用户登录要做好:3.mysql最大连接数设置好,不然会报连接错误:4.版本最好是5.6以上. 1.安装依赖 yum install cmake gcc gl ...
- Spring cloud Greenwich Eureka
1.父工程POM文件中: <dependencyManagement> <dependencies> <!--spring cloud--> <depende ...
- asp.net 多个txt压缩导出下载
//方法代码 MemoryStream ms = new MemoryStream(); byte[] buffer = null; using (ZipFile file = ZipFile.Cre ...
- django url 反响解析,视图
1. 内容回顾 1. 模板语言(字符串替换) 1. 母版和继承 1. 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) 2. 子页面如 ...