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,我们下面要做 ...
随机推荐
- 网络-05-端口号-F5-负载均衡设-linux端口详解大全--TCP注册端口号大全备
[root@test1:Standby] config # [root@test1:Standby] config # [root@test1:Standby] config # [root@test ...
- Jmeter之Redis读写
Jmeter之Redis读写 奔跑的小小鱼 关注 0.2 2019.03.21 18:25* 字数 1330 阅读 45评论 0喜欢 1 Jmeter插件访问Redis共有3种方式: 1)通过自已 ...
- 顶尖 API 文档管理工具 (Yapi)
原文地址:https://www.jianshu.com/p/a97d2efb23c5
- 利用h5 meta 头标签设置og属性进行帖子分享图片时而有时而无
<meta property="og:title" content="fgsfg"> <meta property="og:desc ...
- React Native之遇到的问题
问题一:使用 Android Studio 运行 React Native 新项目时,报错:Unable to load script from assets 'index.android.bundl ...
- kubernets event 分析
1. event 是一个很重要的组成部分 event 分析 Kubernetes(K8s)Events介绍(上) Kubernetes Events介绍(中) Kubernetes Events介绍( ...
- HTML5滚动加载
@using YoSoft.DSM.YoDSMModel;@using YoSoft.DSM.YoDSMBLL;@{ Layout = "~/Views/Shared/_LayoutComp ...
- 【Git】Git使用记录: 基于git ignore文件将remote上的文件untrack
话不多说直接上步骤: git bash直接干到你的code. 直接敲命令: git rm -r --cached . rm是remove 命令 -r将允许递归删除 -cached只会从索引中删除文件. ...
- Qt Designer问题(挖坑)
同时用两个VS的Qt Designer打开.ui文件,关闭Qt Designer之后再打开发现Qt Designer不在打开方式了.要重启VS才行.
- 2019 年 Spread.NET 产品路线图(Roadmap)
前言 | 问题背景 2018年结束了,12月是Spread.NET的重要月份.我们发布了Spread.NET 12,我们期待着 2019 年令人兴奋的新年,这是Windows Forms开发人员有史以 ...