实体类到Datatable

时间:2012-11-28 13:36:34

标签: c# datatable entity

我正在尝试创建一个保存日志的通用类

这里我们使用实体框架,所以想象我们有表 mng_users(string usr_name,int usr_id) 为itentity创建相应的类)

有没有办法实现toDataTable方法将实体转换为数据表(不是列表,只有1行)所以我可以做这样的事情:

将mng_users1和mng_users2作为mng_users实体类(两者具有相同的id但是diff名称)

调用方法“savelog(mng_users1,mng_users2);” 并执行以下代码:

    private DataTable toDataTable(Object T)
    {
        DataTable vDataTable = new DataTable();

        //AddColums here
        //AddRow with the respective values here

        return vDataTable;
    }

    public void savelog(Object newObject, Object oldObject)
    {

        DataTable newvalue, oldvalue;

        newvalue = toDataTable(newObject);
        oldvalue = toDataTable(oldObject);

       string FieldNames = string.Empty, FieldValuesFrom = string.Empty, FieldValuesTo = string.Empty;
       foreach (DataColumn item in newvalue.Columns)
                {
                    if (newvalue.Rows[0][item].ToString() != oldvalue.Rows[0][item].ToString())
                    {
                        FieldNames += (FieldNames.Length > 0 ? " | " : string.Empty) + item.ColumnName;
                        FieldValuesFrom += (FieldValuesFrom.Length > 0 ? " | " : string.Empty) + newvalue.Rows[0][item].ToString();
                        FieldValuesTo += (FieldValuesTo.Length > 0 ? " | " : string.Empty) + oldvalue.Rows[0][item].ToString();
                    }

                }
        // Save log to sql code here
    }

2 个答案:

答案 0 :(得分:11)

以下代码之类的东西应该可行。它可能需要调整,具体取决于属性是private / protected,以及是否有任何公共属性被编入索引,但它应该让你开始。

private DataTable ToDataTable<T>(T entity) where T : class
{
   var properties = typeof(T).GetProperties();
   var table = new DataTable();

   foreach(var property in properties)
   {
       table.Columns.Add(property.Name, property.PropertyType);
   }

   table.Rows.Add(properties.Select(p => p.GetValue(entity, null)).ToArray());
   return table;
}

答案 1 :(得分:7)

我对上述样本的改进:

  • 将语法更改为扩展方法
  • 现在扩展方法将现有对象实体列表转换为DataTable
  • 添加了对Nullable属性类型的支持

    public static DataTable ToDataTable<T>(this IEnumerable<T> entityList) where T : class
    {
        var properties = typeof(T).GetProperties();
        var table = new DataTable();
    
        foreach (var property in properties)
        {
            var type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
            table.Columns.Add(property.Name, type);
        }
        foreach (var entity in entityList)
        {
            table.Rows.Add(properties.Select(p => p.GetValue(entity, null)).ToArray());
        }
        return table;
    }