如何将DataTable转换为List <object>?</object>

时间:2013-09-16 15:15:23

标签: c# list datatable .net-3.5

我有一个强类型的课程PersonExport。我最初将数据转换为DataTable并在DataTable上调用以下方法将其转换为List<PersonExport>

public static List<T> ConvertToList<T>(DataTable dt, out string message)
    {
        message = string.Empty;
        var list = new List<T>();


        try
        {
            var columnNames = dt.Columns.Cast<DataColumn>()
            .Select(c => c.ColumnName)
            .ToList();

            var properties = typeof(T).GetProperties();

            list = dt.AsEnumerable().Select(row =>
            {
                var objT = Activator.CreateInstance<T>();

                foreach (var pro in properties)
                {
                    if (columnNames.Contains(pro.Name))
                    {
                        var value = row[pro.Name];
                        var typeName = value.GetType().FullName;

                        if (typeName == "MySql.Data.Types.MySqlDateTime")
                        {

                            var mySqlDateTime = (MySqlDateTime) value;
                            if (mySqlDateTime.IsValidDateTime)
                            {
                                value = Convert.ToDateTime(mySqlDateTime.ToString());
                                pro.SetValue(objT, value, null);
                            }
                        }
                        else
                        {
                            pro.SetValue(objT, row.IsNull(pro.Name) ? null : value, null);
                        }
                    }
                }

                return objT;
            }).ToList();

        }
        catch (Exception ex)
        {
            message = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
        }

        return list;
    }

但是,一旦我开始从返回的DataTable中删除列,它就不再有效,因为DataTable中的列与PersonExport列表中的属性不匹配。

我最终在这里使用导出的列表导出到excel,但由于我已经DataTable修改了它并且无法反序列化为List<PersonExport>

//Trying to get data into List<object>
List<object> persons = GetPersonExport(query, out message);
var exportData = new Dictionary<string, List<object>> { { "xldata", persons} };

//Deserialize to List<object> to export
var persons = JsonConvert.DeserializeObject<List<object>>(args["xldata"]);

上面的行只返回一个空对象列表。

有些事让我思考,但我想知道什么是最好的方法。我使用EPPLUS库将数据导出到excel,它可以选择隐藏列,所以最好只导出整个对象并隐藏你不想要的列,这样你就可以避免匿名类型或者我可以做的仍然是获取整个对象,但然后将其转换为DataTable然后删除列?想法?

2 个答案:

答案 0 :(得分:2)

你想要的只是:

public IEnumerable<object> GetListOfObject()
{
    foreach (var prod in TenMostExpensiveProducts().Tables[0].AsEnumerable())
    {
        yield return prod;
    }
}

或者:

TenMostExpensiveProducts().Tables[0].AsEnumerable().Select (x => x).ToList<object>()

但你可以通过这样的linq让它变得更优雅:

from prod in TenMostExpensiveProducts().Tables[0].AsEnumerable()
where prod.Field<decimal>("UnitPrice") > 62.500M
select prod

或者像这样(直接在DataSet上调用AsDynamic):

TenMostExpensiveProducts().AsDynamic().Where (x => x.UnitPrice > 62.500M)

我更喜欢最后一种方法,而且最灵活。 P.S。:不要忘记连接System.Data.DataSetExtensions.dll参考

答案 1 :(得分:0)

      List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> row;
        foreach (DataRow dr in dt.Rows)
        {
            row = new Dictionary<string, object>();
            foreach (DataColumn col in dt.Columns)
            {
                row.Add(col.ColumnName, dr[col]);
            }
            rows.Add(row);
        }
        StringBuilder sbRes = new StringBuilder();
        jSon.Serialize(rows, sbRes);
        ret = sbRes.ToString();