2013-09-16 33 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列表中的屬性。

我最終使用導出列表在這裏導出到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庫將數據導出爲ex​​cel,並且可以隱藏列,所以最好是導出整個對象並隱藏不需要的列,這樣可以避免匿名類型或我可以做的仍然是獲得整個對象,但然後將其轉換爲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(); 
相關問題