2016-06-08 106 views
5

我有一個嵌套列表,我需要將它轉換爲C#中的DataSet。我發現很多這方面的例子,但他們沒有做我需要的。我有一個列表中的列表,我需要DataSet中另一個DataTable中的嵌套列表。如何將C#中的嵌套列表轉換爲數據集#

這裏是

public class InvoiceResponse(){ 
    public string BillToName { get; set; } 
    public string BillToAddr1 { get; set; } 
    ... 
    ... 
    public List<InvoiceItemResponse> Items { get; set; }   
} 

我用下面的代碼清單到數據集轉換列表中的一個例子,但它沒有項轉換爲數據表中的數據集

public DataSet CreateDataSet<T>(List<T> list) 
{ 
    //list is nothing or has nothing, return nothing (or add exception handling) 
    if (list == null || list.Count == 0) { return null; } 

    //get the type of the first obj in the list 
    var obj = list[0].GetType(); 

    //now grab all properties 
    var properties = obj.GetProperties(); 

    //make sure the obj has properties, return nothing (or add exception handling) 
    if (properties.Length == 0) { return null; } 

    //it does so create the dataset and table 
    var dataSet = new DataSet(); 
    var dataTable = new DataTable(); 

    //now build the columns from the properties 
    var columns = new DataColumn[properties.Length]; 
    for (int i = 0; i < properties.Length; i++) 
    { 
      columns[i] = new DataColumn(properties[i].Name, properties[i].PropertyType); 
    } 

    //add columns to table 
    dataTable.Columns.AddRange(columns); 

    //now add the list values to the table 
    foreach (var item in list) 
    { 
      //create a new row from table 
      var dataRow = dataTable.NewRow(); 

      //now we have to iterate thru each property of the item and retrieve it's value for the corresponding row's cell 
      var itemProperties = item.GetType().GetProperties(); 

      for (int i = 0; i < itemProperties.Length; i++) 
      { 
       dataRow[i] = itemProperties[i].GetValue(item, null); 
      } 

      //now add the populated row to the table 
      dataTable.Rows.Add(dataRow); 
    } 

    //add table to dataset 
    dataSet.Tables.Add(dataTable); 

    //return dataset 
    return dataSet; 
} 

我怎麼能轉換項目列表到另一個DataTable到DataSet中?

+0

試試這個,而返回的數據集'返回dataset.GetXml();' –

回答

5

你可以只加一點遞歸性的,以你的代碼,這樣的事情:

var set = new DataSet(); 
AddToDataSet(set, resp); 

... 

public static void AddToDataSet(DataSet set, object value) 
{ 
    if (set == null) 
     throw new ArgumentNullException(nameof(set)); 

    if (value == null) 
     return; 

    var type = value.GetType(); 
    var table = set.Tables[type.FullName]; 
    if (table == null) 
    { 
     // create one table per type (name) 
     table = new DataTable(type.FullName); 
     set.Tables.Add(table); 
     foreach (var prop in type.GetProperties().Where(p => p.CanRead)) 
     { 
      if (IsEnumerable(prop)) 
       continue; 

      var col = new DataColumn(prop.Name, prop.PropertyType); 
      table.Columns.Add(col); 
     } 
    } 

    var row = table.NewRow(); 
    foreach (var prop in type.GetProperties().Where(p => p.CanRead)) 
    { 
     object propValue = prop.GetValue(value); 
     if (IsEnumerable(prop)) 
     { 
      if (propValue != null) 
      { 
       foreach (var child in (ICollection)propValue) 
       { 
        AddToDataSet(set, child); 
       } 
      } 
      continue; 
     } 

     row[prop.Name] = propValue; 
    } 
    table.Rows.Add(row); 
} 

private static bool IsEnumerable(PropertyInfo pi) 
{ 
    // note: we could also use IEnumerable (but string, arrays are IEnumerable...) 
    return typeof(ICollection).IsAssignableFrom(pi.PropertyType); 
} 
相關問題