`
sty2008boy
  • 浏览: 296605 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

DataTable 转 LIST

阅读更多

 //D to L
        public static IList<T> ConvertTo<T>(DataTable table)
        {
            if (table == null)
            {
                return null;
            }

            List<DataRow> rows = new List<DataRow>();

            foreach (DataRow row in table.Rows)
            {
                rows.Add(row);
            }

            return ConvertTo<T>(rows);
        }

        public static IList<T> ConvertTo<T>(IList<DataRow> rows)
        {
            IList<T> list = null;

            if (rows != null)
            {
                list = new List<T>();

                foreach (DataRow row in rows)
                {
                    T item = CreateItem<T>(row);
                    list.Add(item);
                }
            }

            return list;
        }  

        public static T CreateItem<T>(DataRow row)  
    {  
        T obj = default(T);  
        if (row != null)  
        {  
            obj = Activator.CreateInstance<T>();  
  
            foreach (DataColumn column in row.Table.Columns)  
            {  
                PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);  
                try  
                {  
                    object value = row[column.ColumnName];  
                    prop.SetValue(obj, value, null);  
                }  
                catch  
                {  //You can log something here   
                    //throw;  
                }  
            }  
        }  
  
        return obj;  
    }  
 

 

//方法2:

把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。 
所以很多人都是按照以下方式做的:

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

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

  

view sourceprint?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);

 

Repeater绑定泛型List<T>比绑定DataTable效率更高,而且绑定List<T>可以实现智能感应提示:

这里举例在Repeater中绑定泛型List<T>的用法:

 用<%#((Type)Container.DataItem).成员 %>可实现智能感应提示,而且比<%# Eval("成员")%>效率更高!

后台.cs代码:

view sourceprint?List<Model.OrderItems> orderItemList = new DAl.OrderItemsDAO().GetListArray("OrderId = '" + orderId + "' order by Id desc");  

repList.DataSource = orderItemList;  

repList.DataBind(); 

 

前台.aspx代码:

view sourceprint?<asp:Repeater ID="repList" runat="server">      

<ItemTemplate>      

    <tr>      

    <td class="td02"><a href='productcon.aspx?id=<%#Eval("ProductId") %>' target="_blank"><%#Eval("ProductName") %></a></td>      

    <td align="right" valign="middle" class="td02">¥<%#((Model.OrderItems)Container.DataItem).UnitPrice %></td>      

    <td valign="middle" class="td02 colorgreg"><%#((Model.OrderItems)Container.DataItem).Quantity%></td>      

    <td align="right" class="td02">¥<%#((Model.OrderItems)Container.DataItem).TotalPrice %></td>      

    </tr>      

</ItemTemplate>      

</asp:Repeater> 
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics