datatable转换为list<model> 映射
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- namespace PORM.Data
- {
- /// <summary>
- /// 常用映射关系帮助类
- /// </summary>
- public class CommonMap
- {
- /// <summary>
- ///
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="dReader"></param>
- /// <returns></returns>
- public static IEnumerable<T> MapToIEnumerable<T>(IDataReader dReader) where T : class
- {
- using (dReader)
- {
- List<string> drFields = new List<string>(dReader.FieldCount);
- for (int i = 0; i < dReader.FieldCount; i++)
- {
- drFields.Add(dReader.GetName(i).ToLower());
- }
- while (dReader.Read())
- {
- T model = Activator.CreateInstance<T>();
- foreach (PropertyInfo pi in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
- {
- if (drFields.Contains(pi.Name.ToLower()))
- {
- if (pi.PropertyType.IsEnum)
- {
- object enumName = Enum.ToObject(pi.PropertyType, pi.GetValue(model, null));
- pi.SetValue(model, enumName, null);
- }
- else
- {
- if (!IsNullOrEmptyOrDBNull(dReader[pi.Name]))
- {
- pi.SetValue(model, MapNullableType(dReader[pi.Name], pi.PropertyType), null);
- }
- }
- }
- }
- yield return model;
- }
- }
- }
- /// <summary>
- ///
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="table"></param>
- /// <returns></returns>
- public static IEnumerable<T> MapToIEnumerable<T>(DataTable table) where T : class
- {
- foreach (DataRow row in table.Rows)
- {
- yield return MapToModel<T>(row);
- }
- }
- /// <summary>
- ///
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="dReader"></param>
- /// <returns></returns>
- public static T MapToModel<T>(IDataReader dReader) where T : class
- {
- using (dReader)
- {
- if (dReader.Read())
- {
- List<string> drFields = new List<string>(dReader.FieldCount);
- for (int i = 0; i < dReader.FieldCount; i++)
- {
- drFields.Add(dReader.GetName(i).ToLower());
- }
- T model = Activator.CreateInstance<T>();
- foreach (PropertyInfo pi in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
- {
- if (drFields.Contains(pi.Name.ToLower()))
- {
- if (pi.PropertyType.IsEnum)
- {
- object enumName = Enum.ToObject(pi.PropertyType, pi.GetValue(model, null));
- pi.SetValue(model, enumName, null);
- }
- else
- {
- if (!IsNullOrEmptyOrDBNull(dReader[pi.Name]))
- {
- pi.SetValue(model, MapNullableType(dReader[pi.Name], pi.PropertyType), null);
- }
- }
- }
- }
- return model;
- }
- }
- return default(T);
- }
- /// <summary>
- ///
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="dRow"></param>
- /// <returns></returns>
- public static T MapToModel<T>(DataRow dRow) where T : class
- {
- try
- {
- List<string> drItems = new List<string>(dRow.ItemArray.Length);
- for (int i = 0; i < dRow.ItemArray.Length; i++)
- {
- drItems.Add(dRow.Table.Columns[i].ColumnName.ToLower());
- }
- T model = Activator.CreateInstance<T>();
- foreach (PropertyInfo pi in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
- {
- if (drItems.Contains(pi.Name.ToLower()))
- {
- if (pi.PropertyType.IsEnum) //属性类型是否表示枚举
- {
- object enumName = Enum.ToObject(pi.PropertyType, pi.GetValue(model, null));
- pi.SetValue(model, enumName, null); //获取枚举值,设置属性值
- }
- else
- {
- if (!IsNullOrEmptyOrDBNull(dRow[pi.Name]))
- {
- pi.SetValue(model, MapNullableType(dRow[pi.Name], pi.PropertyType), null);
- }
- }
- }
- }
- return model;
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="value"></param>
- /// <param name="mType"></param>
- /// <returns></returns>
- public static object MapNullableType(object value, Type mType)
- {
- if (mType.IsGenericType && mType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
- {
- if (IsNullOrEmptyOrDBNull(value))
- return null;
- System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(mType);
- mType = nullableConverter.UnderlyingType;
- }
- if (mType == typeof(bool) || mType == typeof(Boolean))
- {
- if (value is string)
- {
- if (value.ToString() == "1")
- return true;
- else
- return false;
- }
- }
- if (mType.IsEnum) //属性类型是否表示枚举
- {
- int intvalue;
- if (int.TryParse(value.ToString(), out intvalue))
- return Enum.ToObject(mType, Convert.ToInt32(value));
- else
- return System.Enum.Parse(mType, value.ToString(), false);
- }
- return Convert.ChangeType(value, mType);
- }
- /// <summary>
- ///
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="value"></param>
- /// <returns></returns>
- public static T MapType<T>(object value)
- {
- Type type = typeof(T);
- if (CommonMap.IsNullOrEmptyOrDBNull(value))
- value = type.IsValueType ? Activator.CreateInstance(type) : null;
- if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
- {
- try
- {
- return (T)Convert.ChangeType(value, type.GetGenericArguments()[0]);
- }
- catch
- {
- value = null;
- return (T)value;
- }
- }
- if (type.IsEnum)
- return (T)Enum.ToObject(type, value);
- return (T)Convert.ChangeType(value, typeof(T));
- }
- /// <summary>
- /// 判断null或DBNull或空字符串
- /// </summary>
- /// <param name="obj"></param>
- /// <returns></returns>
- public static bool IsNullOrEmptyOrDBNull(object obj)
- {
- return ((obj is DBNull) || obj == null || string.IsNullOrEmpty(obj.ToString())) ? true : false;
- }
- }
- }
List<UnCompareDrug> t = CommonMap.MapToIEnumerable<UnCompareDrug>(dt).ToList();
datatable转换为list<model>
datatable转换为list<model> 映射的更多相关文章
- 三层架构中bll层把datatable转换为实体model的理解
看了很多人的项目,很多都是用到三层架构,其中BLL层中有一种将DataTable转换为实体的方法.一直没有明白为啥要这样做,今天特意去搜索了一下,如果没有答案我是准备提问,寻求解答了.还好找到一个相关 ...
- DataTable转换为List<Model>的通用类
在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便. 所以很多人都是按照以下方式做的: // 获得查询结果DataTable dt = DbHelper ...
- DataTable转换为Model实体对象
记得在学校的时候,接触得最多的就是SqlHelper,每次在读取的时候不管是DataTable还是DataReader转换为实体对象的时候是最恼火的,因为要写很多代码,而且没有什么意义.后面接触到了反 ...
- DataTable转换为List<T>或者DataRow转换为T
这段时间开发ASP.NETMVC应用程序,从数据库获取数据之后,需要把记录转换为数据集在视图中显示.我们需要把DataTable转换为List<T>或者DataRow转换为T. 本篇中可以 ...
- DataTable转List<Model>通用类
/// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...
- Datatable转换为Json 然后,Json数据导入 js 档
C#在里面Datatable转换为Json的5代码示例 /// <summary> /// Datatable转换为Json /// </summary> /// <pa ...
- 第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用
上一篇 第二篇:Entity Framework CodeFirst & Model 映射 主要介绍以Fluent API来实作EntityFramework CodeFirst,得到了大家一 ...
- 再谈使用Emit把Datatable转换为对象集合(List<T>)
一.前因和存在的问题 前面我写了一篇<使用Emit把Datatable转换为对象集合(List<T>)>的博文,其实起源于我自己编写的一个orm工具(见前面几篇博文有介绍),里 ...
- 使用Emit把Datatable转换为对象集合(List<T>)
Emit生成动态方法部分摘自网上,但是经过修改,加入了对委托的缓存以及类结构的调整,使之调用更简洁方便.大致的思路是:要实现转换datatable到某个指定对象的集合,本质是实现转换一个datarow ...
随机推荐
- A1133. Splitting A Linked List
Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...
- (转)你应该知道的RPC原理
背景:对于项目中的RPC框架,仅仅停留在使用层面,对于其底层的实现原理不是很清楚.这样的后果是很危险的,对于面试官来说,跟不知道这个东西一样. 转载自:https://www.cnblogs.com/ ...
- 终于解决了用JAVA写窗口程序在不同的windows界面下的显示保持一致。
好像是两三年前的时候发现这个问题. 由于在windows经典界面与windows xp界面下,窗口的标题栏的高度是不一样的. 所以我们在用Java写GUI程序的时候,会遇到一个问题. 当我把一个JFr ...
- Django(二)框架第一篇基础
https://www.cnblogs.com/haiyan123/p/7701412.html 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref ...
- webpack 非严格模式设置 npm i babel-plugin-transform-remove-strict-mode
安装插件:npm i babel-plugin-transform-remove-strict-mode 在.babelrc文件的插件项添加:"transform-remove-strict ...
- 安全测试之Top 10 漏洞的分析
1. 问题:没有被验证的输入 测试方法: 数据类型(字符串,整型,实数,等) 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值(枚举型) 特定的模式 ...
- http的常用方法和状态码
http常用的方法: 1.get----> 服务器向客户端发送资源,一般来说,是不需要传入参数就可以查看某些信息. 2.post--->客户端向服务器发送请求,一般来说,是传入参数,服务端 ...
- mysql 存储过程中文乱码的解决方法
CREATE PROCEDURE `PROC_FOOBAR`(id INTEGER) BEGIN DECLARE code, user_id VARCHAR(32) CHARACTER SET utf ...
- JS数据交换的三种方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS设置边框、符号、背景样式、链接属性
一.CSS边框空白 padding-top:10px; /*上边框留空白*/ padding-right:10px; /*右边框留空白*/ padding-bottom:10px; /*下边框留空白* ...