扩展方法 针对DataTable操作

15 篇文章 0 订阅
5 篇文章 0 订阅
扩展方法类,必须是静态的类,以及静态方法。

public static class ExMethod
{    
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt"></param>
    /// <param name="split"></param>
    /// <returns></returns>
    public static List<T> GetModelItem<T>(this DataTable @dt, string split) where T : new()
    {
        List<T> item = new List<T>();
        foreach (DataRow dr in dt.Rows)
        {
            T tt = dr.GetModel<T>(dt.Columns, "_");
            if (null == tt || tt.Equals(default(T)))
            {
                continue;
            }
            item.Add(tt);
        }
        return item;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt"></param>
    /// <param name="split"></param>
    /// <returns></returns>
    public static List<T> GetModelItem<T>(this DataTable @dt) where T : new()
    {
        return GetModelItem<T>(@dt, null);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dr"></param>
    /// <param name="dcc"></param>
    /// <param name="split"></param>
    /// <returns></returns>
    public static T GetModel<T>(this DataRow @dr, DataColumnCollection dcc, string split) where T : new()
    {
        T _newT = new T();
        Type tt = _newT.GetType();
        foreach (DataColumn dc in dcc)
        {
            object value = dr[dc];
            PropertyInfo pi = tt.GetProperty(split.IsNullOrEmpty() ? dc.ColumnName : dc.ColumnName.Replace(split, ""), BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
            if (null == pi)
            {
                continue;
            }
            if (pi.PropertyType.IsEnum)
            {
                pi.SetValue(_newT, Enum.Parse(pi.PropertyType, string.Format("{0}", value)), null);
            }
            else
            {
                pi.SetValue(_newT, Convert.ChangeType(value, pi.PropertyType, null), null);
            }
        }
        return _newT;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt"></param>
    /// <param name="split"></param>
    /// <returns></returns>
    public static T GetModel<T>(this DataTable @dt, string split) where T : new()
    {
        if (null == @dt)
        {
            return default(T);
        }
        return GetModel<T>(dt.Rows[0], dt.Columns, split);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static T GetModel<T>(this DataTable @dt) where T : new()
    {
        if (null == @dt || 0 == @dt.Rows.Count)
        {
            return default(T);
        }
        return GetModel<T>(dt.Rows[0], dt.Columns, null);
    }
}

用个简单的例子来说明一下上面的方法吧。

在数据表中有一张【tableName】表,表的字段有四字分别是 field1、field2、field3、field4。

同时创建一个table的模型类如下所示:

public class tableName
{
    public string field1{get;set;}
    public string field2{get;set;}
    public string field3{get;set;}
    public string field4{get;set;}
}
表的结构和类的结构一样


现在要获取一个tableName表里所有数据

一般正常情况如下:

string sqlQuery = string.Format("[0}",select * from tableName);
DataTable dt = DatabaseHelper.GetDataTable(sqlQuery);
List<tableName> item = new List<tableName();
//-->最好判断一下dt是否为空
foreach(DataRow dr in dt.Rows)
{
     tableName tn = new tableName();
     tn.field1 = string.Format("{0}",dr["field1"]);
     tn.field2 = string.Format("{0}",dr["field2"]);
     tn.field3 = string.Format("{0}",dr["field3"]);
     tn.field4 = string.Format("{0}",dr["field4"]);
    item.Add(tn);
}
//现在将返回的数据,转换成对象了数据了。

如果又有 tableName1这样一张表,同样也有一个对象的 tableName1类模型

同样要获取 tableName里的数据转成 List<tableName1> 集合

又得写 一遍

foreach(DataRow dr in dt.Rows){

    ....

}


现在写一个通用的方法

只要传入一个对象模型就可以,返回 对象模型数据集合。

public  static List<T> GetModelItem<T>(DataTable dt)
{
      //-->代码处理
}

将上面那段代码放到扩展方法里如下所示:

sqlQuery = string.Format("{0}","select * from tableName");
List<tableName> item =  DatabaseHelper.GetDataTable(sqlQuery).GetModeItem<tableName>();
sqlQuery = string.Format("{0}","select * from tableNam1");
List<tableName1> item = DatabaseHelper.GetDataTable(sqlQuery).GetModelItem<tableName1>();

这样就不用想要表数据的时候,都要去写一个foreach来对对象模型进行赋值了

这样的话通过扩展方法就挺了,用起来也方便许多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值