• DataTable转换为List<Model>的通用类


    在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。

    所以很多人都是按照以下方式做的:

    // 获得查询结果
    DataTable dt = DbHelper.ExecuteDataTable(...);
    // 把DataTable转换为IList<UserInfo>
    IList<UserInfo> users = ConvertToUserInfo(dt);

      

    问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?
    解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型

      

    不多说,核心代码如下,经过测试,性能不错,大家可以根据实际情况改善
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Reflection;

    namespace NCL.Data
    {
        
    /// <summary>
        
    /// 实体转换辅助类
        
    /// </summary>
        public class ModelConvertHelper<T> where  T : new()
        {
            
    public static IList<T> ConvertToModel(DataTable dt)
            {
                
    // 定义集合
                IList<T> ts = new List<T>();

                
    // 获得此模型的类型
                Type type = typeof(T);

                
    string tempName = "";

                
    foreach (DataRow dr in dt.Rows)
                {
                    T t 
    = new T();

                    
    // 获得此模型的公共属性
                    PropertyInfo[] propertys = t.GetType().GetProperties();

                    
    foreach (PropertyInfo pi in propertys)
                    {
                        tempName 
    = pi.Name;

                        
    // 检查DataTable是否包含此列
                        if (dt.Columns.Contains(tempName))
                        {
                            
    // 判断此属性是否有Setter
                            if (!pi.CanWrite) continue;

                            
    object value = dr[tempName];
                            
    if (value != DBNull.Value)
                                pi.SetValue(t, value, 
    null);
                        }
                    }

                    ts.Add(t);
                }

                
    return ts;

            }
        }
    }

    使用方式:

    // 获得查询结果
    DataTable dt = DbHelper.ExecuteDataTable(...);
    // 把DataTable转换为IList<UserInfo>
    IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);

      

    呵呵,这样子是不是很方便了,谢谢,希望能给你带来收获!

  • 相关阅读:
    类和对象
    数组
    随笔3
    设计把所有的奇数移动到所有偶数前面的算法
    选择排序
    队列的链式存储结构
    循环队列
    一起玩算法(把所有相同的数字后移)
    判断序列B是否是序列A的连续子序列
    power bi创建切片器导航
  • 原文地址:https://www.cnblogs.com/JoshuaDreaming/p/1969139.html
Copyright © 2020-2023  润新知