【问题标题】:Convert dynamic list to datatable c#将动态列表转换为数据表c#
【发布时间】:2014-02-10 09:04:32
【问题描述】:

我正在搜索和破解如何将动态列表转换为数据包, c#,请指教,谢谢

List<dynamic>dlist=new List<dynamic>

DataTable 

【问题讨论】:

  • 您的意思是,项目中的每个属性/字段都应该成为数据表中的列?如果dlist 中的每个项目都是不同的类型怎么办?最重要的是:您已经尝试过什么?展示你的努力。

标签: c#


【解决方案1】:

我认为你看起来像这样。希望它对你有用。

从动态列表到数据表:

   List<dynamic> dlist=new List<dynamic> 
   var json = JsonConvert.SerializeObject(dlist);
   DataTable dataTable = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));

也可以从DataTable中获取JsonString:

string JSONresult = JsonConvert.SerializeObject(dataTable);

【讨论】:

  • 极好的解决方案
  • 优秀的解决方案@Majedur bro :)
【解决方案2】:

以下是可以将任意列表对象转换为数据表的方法..

 public DataTable ConvertToDataTable<T>(IList<T> data)
    {
        PropertyDescriptorCollection properties =
           TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;

    }

http://social.msdn.microsoft.com/Forums/vstudio/en-US/6ffcb247-77fb-40b4-bcba-08ba377ab9db/converting-a-list-to-datatable?forum=csharpgeneral

【讨论】:

    【解决方案3】:
     public DataTable ToDataTable<T>(dynamic items)
        {
    
            DataTable dtDataTable = new DataTable();
            if (items.Count == 0) return dtDataTable;
    
            ((IEnumerable)items[0]).Cast<dynamic>().Select(p => p.Name).ToList().ForEach(col => { dtDataTable.Columns.Add(col); });
    
            ((IEnumerable)items).Cast<dynamic>().ToList().
                ForEach(data =>
                {
                    DataRow dr = dtDataTable.NewRow();
                    ((IEnumerable)data).Cast<dynamic>().ToList().ForEach(Col => { dr[Col.Name] = Col.Value; });
                    dtDataTable.Rows.Add(dr);
                });
            return dtDataTable;
        }
    

    【讨论】:

    • 这对我有用,尽管我不得不将“Key”换成“Name”,因为我的可枚举包含 KeyValuePairs
    • 如果 IEnumerable 不包含任何项目,我认为这不会起作用 - 它会返回一个没有列或行的 DataTable。我想要一个有列但没有行的 DataTable
    【解决方案4】:

    我不知道你为什么需要这个,但是,你可以使用这个ObjectShredder 使用反射,它可以将任何东西转换为DataTable,所以即使是动态或匿名类型:

    Implement CopyToDataTable&lt;T&gt; Where the generic Type T Is Not a DataRow

    不过,我的建议是不要将该扩展方法命名为 CopyToDataTable,而是将其命名为 CopyAnyToDataTable,以避免与现有扩展方法 CopyToDataTable 发生冲突。

    【讨论】:

      【解决方案5】:

      使用这个功能,

      public static DataTable ConvertToDatatable<T>(this IList<T> data)
      {
          PropertyDescriptorCollection props =
              TypeDescriptor.GetProperties(typeof(T));
          DataTable table = new DataTable();
          for(int i = 0 ; i < props.Count ; i++)
          {
              PropertyDescriptor prop = props[i];
              table.Columns.Add(prop.Name, prop.PropertyType);
          }
          object[] values = new object[props.Count];
          foreach (T item in data)
          {
              for (int i = 0; i < values.Length; i++)
              {
                  values[i] = props[i].GetValue(item);
              }
              table.Rows.Add(values);
          }
          return table;        
          }
      

      【讨论】:

        【解决方案6】:

        如果基础类型是 ExpandoObject,那么您需要检查 IDictionary 而不是通过反射。希望这对将来的其他人有所帮助:

            public static DataTable ConvertToDataTable<T>(IEnumerable<T> data)
            {
                DataTable table = new DataTable();
                foreach (T item in data)
                {
                    if (item is IDictionary<string, object> dict)
                    {
                        foreach (var key in dict)
                        {
                            table.Columns.Add(key.Key, key.Value?.GetType() ?? typeof(object));
                        }
                        break;
                    }
                    foreach (var prop in typeof(T).GetProperties())
                    {
                        table.Columns.Add(prop.Name, prop.PropertyType);
                    }
                    break;
                }
        
                DataRow row = null;
                foreach (T item in data)
                {
                    if (item is IDictionary<string, object> dict)
                    {
                        row = table.NewRow();
                        foreach (var key in dict)
                        {
                            row[key.Key] = key.Value;
                        }
                        table.Rows.Add(row);
                        continue;
                    }
        
                    row = table.NewRow();
                    foreach (var prop in typeof(T).GetProperties())
                    {
                        row[prop.Name] = prop.GetValue(item);
                    }
                    table.Rows.Add(row);
                }
                return table;
            }
        

        【讨论】:

        • 如果 IEnumerable 不包含任何项目,我认为这不会起作用 - 它会返回一个没有列或行的 DataTable。我想要一个有列但没有行的 DataTable
        • @Colin 如果您在下面使用 Dynamic/ExpandoObject,除非您在该列表中至少有一个项目,否则您将没有任何列要指定,因为否则类型 T 实际上什么都不是,因为它不会甚至被定义。
        【解决方案7】:

        使用 C# 将动态列表对象转换为 DataTable

         public DataTable DynamicToDT(List<object> objects)
                {
                    DataTable dt = new DataTable("StudyRecords"); // Runtime Datatable          
                    string[] arr = { "Name", "Department", "CollegeName", "Address" };// Column Name for DataTable
                    if (objects != null && objects.Count > 0)
                    {
                        for (int i = 0; i < objects.Count; i++)
                        {
                            dt.Columns.Add(arr[i]);
                            if (i == 0)
                            {
                                var items = objects[0] as IEnumerable<string>;
                                foreach (var itm in items)
                                {
                                    DataRow dr1 = dt.NewRow(); // Adding values to Datatable  
                                    dr1[arr[i]] = itm;
                                    dt.Rows.Add(dr1);
                                }
                            }
                            else
                            {
                                var items = objects[i] as IEnumerable<string>;
                                int count = 0;
                                foreach (var itm in items)
                                {
                                    dt.Rows[count][arr[i]] = itm;
                                    count++;
                                }
                            }
                        }
        
                        return dt; // Converted Dynamic list to Datatable  
                    }
                    return null;
                }
        

        【讨论】:

          【解决方案8】:

          public static DataTable DynamicToDT(List objects)

              {
                  var data = objects.ToArray();
                  if (data.Count() == 0) return null;
                  var dt = new DataTable();
                  foreach (var key in ((IDictionary<string, object>)data[0]).Keys)
                  {
                      dt.Columns.Add(key);
                  }
                  foreach (var d in data)
                  {
                      dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
                  }
                  return dt;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-02-19
            • 1970-01-01
            • 2012-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多