2013-09-16 2 views
2

У меня есть типично типизированный класс PersonExport. пока я сначала получить данные в DataTable и вызовите следующий метод на DataTable, чтобы преобразовать его в List<PersonExport>:Как преобразовать DataTable в список <object>?

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.

Я в конце концов, с помощью экспортированного списка здесь, чтобы экспортировать, чтобы преуспеть, но он не работает, так как я модифицируется DataTable и он не может Deserialize в 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, а затем удалить столбцы? Мысли?

+0

Пожалуйста, не публикуйте весь код трудно читать все ваши вопросы. Просто спросите, чего вы хотите, не до и после истории. Конкретный вопрос о вашем названии достаточно много. – AuthorProxy

+0

помогает ли мой ответ? – AuthorProxy

ответ

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 

Или как это (AsDynamic вызывается непосредственно на DataSet):

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

Я предпочитаю последний подход, пока он является наиболее гибким. P.S .: Не забудьте подключить System.Data.DataSetExtensions.dll

присвоенный
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(); 
Смежные вопросы