datatable to List<T>带缓存
public class DataHelper
{
//datarow 转换的类型缓存
private static MemoryCache modelCash = MemoryCache.Default; /// <summary>
/// 将DataTable集合转换为指定的对象集合
/// </summary>
/// <typeparam name="T">要转换成的对象类型</typeparam>
/// <param name="dt">DataTable数据集合</param>
/// <returns>指定的对象集合</returns>
public static List<T> DataTableToList<T>(DataTable dt)
where T : new()
{
var modelList = new List<T>();
int rowsCount = dt.Rows.Count;
if (rowsCount > )
{
for (int n = ; n < rowsCount; n++)
{
var model = DataRowToModel<T>(dt.Rows[n]);
modelList.Add(model);
}
} return modelList;
} /// <summary>
/// 将DataRow数据转换为指定的对象
/// </summary>
public static T DataRowToModel<T>(DataRow dr)
where T : new()
{
if (dr == null) return default(T); var isResetCash = false;
var model = new T();
var propertyHt = GetCashValue(model.GetType().Name) ?? new Hashtable(); for (var i = ; i < dr.Table.Columns.Count; i++)
{
var fieldName = dr.Table.Columns[i].ColumnName;
var property = GetProperty(ref isResetCash, model, propertyHt, fieldName); if (property != null)
{
var fullName = property.PropertyType.FullName;
if (fullName.Contains("Guid"))
{
if (!string.IsNullOrEmpty(dr[fieldName].ToString()))
property.SetValue(model, new Guid(dr[fieldName].ToString()), null);
else
property.SetValue(model, null, null);
}
else if (fullName.Contains("Double"))
{
if (!string.IsNullOrEmpty(dr[fieldName].ToString()))
property.SetValue(model, double.Parse(dr[fieldName].ToString()), null);
else
property.SetValue(model, null, null);
}
else if (fullName.Contains("Int32"))
{
if (!string.IsNullOrEmpty(dr[fieldName].ToString()))
property.SetValue(model, int.Parse(dr[fieldName].ToString()), null);
else
property.SetValue(model, null, null);
}
else if (fullName.Contains("System.DateTime"))
{
if (!string.IsNullOrEmpty(dr[fieldName].ToString()))
property.SetValue(model, Convert.ToDateTime(dr[fieldName]), null);
else
property.SetValue(model, null, null);
}
else if (fullName.Contains("System.Byte"))
{
if (!string.IsNullOrEmpty(dr[fieldName].ToString()))
property.SetValue(model, dr[fieldName], null);
else
property.SetValue(model, null, null);
}
else if (fullName.Contains("System.Boolean"))
{
if (!string.IsNullOrEmpty(dr[fieldName].ToString()))
property.SetValue(model, dr[fieldName], null);
else
property.SetValue(model, null, null);
}
else if (fullName.Contains("System.Single"))
{
if (!string.IsNullOrEmpty(dr[fieldName].ToString()))
property.SetValue(model, dr[fieldName], null);
else
property.SetValue(model, null, null);
}
else
{
property.SetValue(model, dr[fieldName].ToString(), null);
}
}
} if (isResetCash) SetCashValue(model.GetType().Name, propertyHt);
return model;
} private static PropertyInfo GetProperty<T>(ref bool isResetCash, T model, Hashtable propertyHt, string fieldName)
{
PropertyInfo property = null;
if (propertyHt != null)
{
if (propertyHt.ContainsKey(fieldName))
{
property = propertyHt[fieldName] as PropertyInfo;
}
else
{
property = model.GetType().GetProperty(fieldName);
if (property != null)
{
propertyHt[fieldName] = property;
isResetCash = true;
}
}
}
else
{
property = model.GetType().GetProperty(fieldName);
if (property != null)
{
propertyHt[fieldName] = property;
isResetCash = true;
}
} return property;
} private static Hashtable GetCashValue(string key)
{
if (modelCash.Contains(key))
{
return modelCash[key] as Hashtable;
}
return null;
} private static void SetCashValue(string key, Hashtable value)
{
CacheItemPolicy cip = new CacheItemPolicy()
{
AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes( * * ))
}; modelCash.Set(key, value, cip);
}
}
public class DataHelper { //datarow 转换的类型缓存 private static MemoryCache modelCash = MemoryCache.Default;
/// <summary> /// 将DataTable集合转换为指定的对象集合 /// </summary> /// <typeparam name="T">要转换成的对象类型</typeparam> /// <param name="dt">DataTable数据集合</param> /// <returns>指定的对象集合</returns> public static List<T> DataTableToList<T>(DataTable dt) where T : new() { var modelList = new List<T>(); int rowsCount = dt.Rows.Count; if (rowsCount > 0) { for (int n = 0; n < rowsCount; n++) { var model = DataRowToModel<T>(dt.Rows[n]); modelList.Add(model); } }
return modelList; }
/// <summary> /// 将DataRow数据转换为指定的对象 /// </summary> public static T DataRowToModel<T>(DataRow dr) where T : new() { if (dr == null) return default(T);
var isResetCash = false; var model = new T(); var propertyHt = GetCashValue(model.GetType().Name) ?? new Hashtable();
for (var i = 0; i < dr.Table.Columns.Count; i++) { var fieldName = dr.Table.Columns[i].ColumnName; var property = GetProperty(ref isResetCash, model, propertyHt, fieldName);
if (property != null) { var fullName = property.PropertyType.FullName; if (fullName.Contains("Guid")) { if (!string.IsNullOrEmpty(dr[fieldName].ToString())) property.SetValue(model, new Guid(dr[fieldName].ToString()), null); else property.SetValue(model, null, null); } else if (fullName.Contains("Double")) { if (!string.IsNullOrEmpty(dr[fieldName].ToString())) property.SetValue(model, double.Parse(dr[fieldName].ToString()), null); else property.SetValue(model, null, null); } else if (fullName.Contains("Int32")) { if (!string.IsNullOrEmpty(dr[fieldName].ToString())) property.SetValue(model, int.Parse(dr[fieldName].ToString()), null); else property.SetValue(model, null, null); } else if (fullName.Contains("System.DateTime")) { if (!string.IsNullOrEmpty(dr[fieldName].ToString())) property.SetValue(model, Convert.ToDateTime(dr[fieldName]), null); else property.SetValue(model, null, null); } else if (fullName.Contains("System.Byte")) { if (!string.IsNullOrEmpty(dr[fieldName].ToString())) property.SetValue(model, dr[fieldName], null); else property.SetValue(model, null, null); } else if (fullName.Contains("System.Boolean")) { if (!string.IsNullOrEmpty(dr[fieldName].ToString())) property.SetValue(model, dr[fieldName], null); else property.SetValue(model, null, null); } else if (fullName.Contains("System.Single")) { if (!string.IsNullOrEmpty(dr[fieldName].ToString())) property.SetValue(model, dr[fieldName], null); else property.SetValue(model, null, null); } else { property.SetValue(model, dr[fieldName].ToString(), null); } } }
if (isResetCash) SetCashValue(model.GetType().Name, propertyHt); return model; }
private static PropertyInfo GetProperty<T>(ref bool isResetCash, T model, Hashtable propertyHt, string fieldName) { PropertyInfo property = null; if (propertyHt != null) { if (propertyHt.ContainsKey(fieldName)) { property = propertyHt[fieldName] as PropertyInfo; } else { property = model.GetType().GetProperty(fieldName); if (property != null) { propertyHt[fieldName] = property; isResetCash = true; } } } else { property = model.GetType().GetProperty(fieldName); if (property != null) { propertyHt[fieldName] = property; isResetCash = true; } }
return property; }
private static Hashtable GetCashValue(string key) { if (modelCash.Contains(key)) { return modelCash[key] as Hashtable; } return null; }
private static void SetCashValue(string key, Hashtable value) { CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(30 * 24 * 60)) };
modelCash.Set(key, value, cip); } }
datatable to List<T>带缓存的更多相关文章
- 带缓存的输入输出-bufferedinputstream类与bufferedoutputstream类
package hengzhe.cn.o1; import java.io.*; /* * 带缓存的输入输出-bufferedinputstream类与bufferedoutputstream类 * ...
- 不带缓存的I/O和标准(带缓存的)I/O
首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的 ...
- 基于AFN封装的带缓存的网络请求
给大家分享一个基于AFN封装的网络请求 git: https://github.com/zhouxihi/NVNetworking #带缓存机制的网络请求 各类请求有分带缓存 , 不带缓存, 可自定义 ...
- Delphi中带缓存的数据更新技术
一. 概念 在网络环境下,数据库应用程序是c/s或者是多层结构的模式.在这种环境下,数据库应用程序的开发应当尽可能考虑减少网络数据传输量,并且尽量提高并发度.基于这个目的,带缓存的数据更新技术应运而生 ...
- 带标准IO带缓存区和非标准IO 遇到fork是的情况分析
废话不多说 直接代码 #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include< ...
- 不带缓存IO和标准(带缓存)IO
linux对IO文件的操作分为: 不带缓存:open read.posix标准,在用户空间没有缓冲,在内核空间还是进行了缓存的.数据-----内核缓存区----磁盘 假设内核缓存区长度为100字节,你 ...
- 使用TP自带缓存时。出现第一次拿不到数据。
使用TP自带缓存时.出现第一次拿不到数据. 仔细检查逻辑发现了问题所在. 逻辑:直接读缓存,如果没有从数据库查询,然后存入缓存. 问题出在以为$exchange = S($fileName,$exch ...
- 带缓存的基于DateTimeFormatter的日期格式化工具类
JAVA中的SimpleDateFormat是非线程安全的,所有在1.8的JDK版本里提供了线程安全的DateTimeFormatter类,由于是线程安全的,故我们可以将此类缓存起来多次利用提高效率. ...
- Yii的自带缓存的使用
Yii的自带缓存都继承CCache 类, 在使用上基本没有区别缓存基础类 CCache 提供了两个最常用的方法:set() 和 get().要在缓存中存储变量 $value,我们选择一个唯一 ID 并 ...
随机推荐
- Cheapest Palindrome [POJ3280] [区间DP] [经典]
一句话题意:每个字母添加和删除都相应代价(可以任意位置 增加/删除),求把原串变成回文串的最小代价 Description 保持对所有奶牛的跟踪是一项棘手的任务,因此农场主约翰已经安装了一个系统来实现 ...
- 移动端适配问题px->rem方法
移动端web页面适配问题 1.引入插件 github地址:https://github.com/re54k/mobileweb-utilities/blob/master/util/mobile-ut ...
- GMA Round 1 极坐标的忧伤
传送门 极坐标的忧伤 为什么你们不喜欢为我求导……——极坐标 极坐标的心意,想必已经传达到了,那么请为极坐标方程$r=t$(也写作$ρ=θ$)求导吧. 为了考验你的忠诚,你需要回答$r=t$在(0,$ ...
- JS冲刺
1.简单/复杂数据类型1)基本数据类型把数据名和值直接存储在栈当中复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值,访问时先从栈中获取地址,再到堆中拿出相应的值简单数据类型:number ...
- JSAP101
JSAP101 1.DOM 1)文档对象模型 文档:把一个Html文件看成一个文档,所以把这个文档看成一个对象.XML文件也可以看成一个文件.XML侧重于存储数据,html主要以展示为主.一个页面就是 ...
- openstack之glance基础
第一:glance是什么? glance是Image service的项目代号,是Openstack的镜像服务组件,为创建虚拟机提供镜像服务. 第二:glance的功能 Glance主要提供了一个虚拟 ...
- Hibernate(11)_基于外键的双向1对1
一.基于外键的双向1对1 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true&q ...
- Vue 2.3、2.4 知识点小结
2.3 style 多重值: <div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }">< ...
- sqlserver数据库出现可疑错误修复方法
一.主数据库出现可疑修复方法: 第一种方法: 当数据库发生这种操作故障时,可以按如下操作步骤可处理此要领,打开数据库里的Sql查询编辑器窗口,运行以下的命令: ?修改数据库为紧急模式 ALTER DA ...
- JS如何判断浏览器类型和详细区分IE各版本浏览器
/* * 描述:判断浏览器信息 * 编写:LittleQiang_w * 日期:2016.1.5 * 版本:V1.1 */ //判断当前浏览类型 function BrowserType() { va ...