2015-02-24 249 views
1

我想獲取一個數據表的函數&返回一個List(對象不是DataRow) 例如, :將DataTable轉換爲LINQ匿名類型

我知道我能做到這一點(但是這需要被稱爲列名):

 // Datatable dt = Filled from a Database query & has 3 columns Code,Description & ShortCode 

     List<object> rtn = new List<object>(); 

     var x = from vals in dt.Select() 
       select new 
       { 
        Code = vals["Code"], 
        Description = vals["Description"], 
        ShortCode = vals["ShortCode"], 
       }; 
     rtn.AddRange(x) 

     return rtn; 

我要的是一個通用版本,這樣我可以在任何數據表&通過將基於數據表中的列名稱。

+0

取決於列。 #Abdul Rehman Sayed – 2015-02-24 08:01:13

+2

那麼這種方法的用法是什麼?你怎麼用'List '?這將無濟於事AFAICS – 2015-02-24 08:01:30

+0

我需要它爲wcf生成JSON。 (我的wcf方法返回列表),它將被.NET和非網絡客戶端使用@SriramSakthivel – 2015-02-24 08:03:07

回答

5

由於在編譯時不知道屬性名稱,並且想要將數據用於JSON序列化,因此可以使用以下命令創建字典列表。如果您使用Newtonsoft JSON,那麼序列化會照顧以JSON對象格式轉換鍵值對。

IEnumerable<Dictionary<string,object>> result = dt.Select().Select(x => x.ItemArray.Select((a, i) => new { Name = dt.Columns[i].ColumnName, Value = a }) 
                        .ToDictionary(a => a.Name, a => a.Value)); 
+0

這是一個完美的解決方案。榮譽給你! – kexx 2016-10-18 21:53:17

3

爲了動態創建的屬性,以便與不同的一組列的處理不同的數據表,我們可以使用System.Dynamic.ExpandoObject。它基本上實現了,IDictionary <字符串,對象>。格式,可以很容易地轉換爲JSON。

 int colCount = dt.Columns.Count; 
     foreach (DataRow dr in dt.Rows) 
     { 
      dynamic objExpando = new System.Dynamic.ExpandoObject(); 
      var obj = objExpando as IDictionary<string, object>; 

      for (int i = 0; i < colCount; i++) 
      { 
       string key = dr.Table.Columns[i].ColumnName.ToString(); 
       string val = dr[key].ToString(); 

       obj[key] = val; 
      } 
      rtn.Add(obj); 
     }   

     String json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(rtn); 
+0

這是非常有用的,謝謝@Piyush – 2018-02-05 07:30:54

0

您可以使用下面的通用功能: -

private static List<T> ConvertDataTable<T>(DataTable dt) 
{ 
    List<T> data = newList<T>(); 
    foreach (DataRowrow in dt.Rows) 
    { 
     Titem = GetItem<T>(row); 
     data.Add(item); 
    } 
    return data; 
} 

private static TGetItem<T>(DataRow dr) 
{ 
    Type temp = typeof(T); 
    T obj =Activator.CreateInstance<T>(); 
    foreach (DataColumncolumn in dr.Table.Columns) 
    { 
     foreach (PropertyInfopro in temp.GetProperties()) 
     { 
     if (pro.Name == column.ColumnName) 
     pro.SetValue(obj,dr[column.ColumnName], null); 
     else 
     continue; 
     } 
    } 
    return obj; 
} 

請檢查my article,這對如何使用此泛型方法完成演示。

+2

這就要求T事先知道。在我的情況下,我想要一個匿名對象。 – 2015-03-07 05:47:05