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,我们下面要做 ...
随机推荐
- zimbra填坑记录
邮件服务器上架,问题记录. 1.DNS解析设置,zimbra收发邮件均使用统一域名,mail.xxxx.com.cn,因此在做SMTP,POP,MX记录时均应指向此域名. 2.实际上架内部网络和安装所 ...
- Java面试题整理---网络篇
1.BIO.AIO和NIO的概念及区别? 2.什么是长连接和短连接? 3.http1.0.http1.1和http2.0的区别? 4.https和http的区别? 5.https的工作原理? ...
- Unicode,GBK和UTF8
字符集 在介绍他们之间的区别时, 我们先讲下什么是Unicode. 简单来说,Unicode是一个字符集(character set), 和ASCII一样, 其作用是用一系列数字来表示字符(chara ...
- Linux中检查本地系统上的开放端口列表的方法
在 Linux 中很少有用于此目的的实用程序.然而,我提供了四个最重要的 Linux 命令来检查这一点. 你可以使用以下四个命令来完成这个工作.这些命令是非常出名的并被 Linux 管理员广泛使用.n ...
- delphi idhttp post 普通提交乱码处理
var IdHTTP1:TIdHTTP; postStream : TStringStream; Wstr:WideString; res:WideString; begin IdHTTP1 := T ...
- %zsy %lqs 随感
今天是cj的大毒瘤zsy(对对,您说的都对,题目不难的啦,是我太菜啦)出题. 我校选手lqs仍然坚持高水平的发挥,wzy神犇却不在状态. 面对T1sb题(其实干了2h)和T3的原题(我&lqs ...
- Java线程池ThreadPoolExecutor原理和用法
1.ThreadPoolExecutor构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAli ...
- SQL语句——exists和in区别
表结构及数据 user表 order表 in select * from table A where id in (xxxxxxxxxxx):满足条件的数据会被查出来: 先查询子查询的表,然后将内表. ...
- CH 6201 走廊泼水节题解
题目链接:CH6201 当时在海亮考试的第一题: 心得:其实一个算法是要真正理解这个思路和过程,而并不是单单知道它是用来写什么题的: 思路:n个节点有n-1条边,把这n-1条边按照权值从小到大排序,有 ...
- Bugku-CTF之Trim的日记本(不要一次就放弃)
Day19 Trim的日记本 http://123.206.87.240:9002/ hints:不要一次就放弃