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