文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>DataTable转换为List<Model>的通用类

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

时间:2011-03-11  来源:墟零

把查询结果以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);

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

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

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

后台.cs代码:

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

 

前台.aspx代码:

<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> 

 

 

浅谈.NET中的数据绑定表达式(二)

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载