在C#中将列表转换为数据集

时间:2014-07-15 08:45:17

标签: c# json linq dataset

我正在尝试将List转换为Dataset(DataTables集)。但是当我尝试这个时,我只得到了一张桌子。但根据我的模型它必须是5个表。任何人都可以告诉我这个。

我的矩阵模型

 public class MatrixModel
    {

        public class RootObject
        {

            public string responseId { get; set; }
            public string searchId { get; set; }
            public int totalFound { get; set; }
            public List<availableHotels> availableHotels { get; set; }
        }

        public class availableHotels
        {
            public string processId { get; set; }
            public string hotelCode { get; set; }
            public string availabilityStatus { get; set; }

            public double totalPrice { get; set; }
            public double totalTax { get; set; }

            public double totalSalePrice { get; set; }

            public string currency { get; set; }

            public string boardType { get; set; }
            public List<rooms> rooms { get; set; }



        }

        public class rooms
        {
            public string roomCategory { get; set; }
            public List<paxes> paxes { get; set; }
            public double totalRoomRate { get; set; }
            public List<ratesPerNight> ratesPerNight { get; set; }
        }

        public class paxes
        {
            public string paxType { get; set; }
            public int age { get; set; }


        }

        public class ratesPerNight
        {
            public string date { get; set; }
            public double amount { get; set; }
        }
    }

将Json响应转换为列表

   List<MatrixModel.RootObject> ddd = JsonConvert.DeserializeObject<List<MatrixModel.RootObject>>("["+tstobj+"]");

将列表转换为数据集


DataSet dvv=ddd.ToDataSet<MatrixModel.RootObject>();


public static class ListConverter
    {

        /// <summary>
        /// Convert our IList to a DataTable
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns>DataTable</returns>
        public static DataTable ToDataTable<T>(this IEnumerable<T> list)
        {
            Type elementType = typeof(T);
            using (DataTable t = new DataTable())
            {
                PropertyInfo[] _props = elementType.GetProperties();
                foreach (PropertyInfo propInfo in _props)
                {
                    Type _pi = propInfo.PropertyType;
                    Type ColType = Nullable.GetUnderlyingType(_pi) ?? _pi;
                    t.Columns.Add(propInfo.Name, ColType);
                }
                foreach (T item in list)
                {
                    DataRow row = t.NewRow();
                    foreach (PropertyInfo propInfo in _props)
                    {
                        row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value;
                    }
                    t.Rows.Add(row);
                }
                return t;
            }
        }

        /// <summary>
        /// Convert our IList to a DataSet
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns>DataSet</returns>
        public static DataSet ToDataSet<T>(this IEnumerable<T> list)
        {
            using (DataSet ds = new DataSet())
            {
                ds.Tables.Add(list.ToDataTable());
                return ds;
            }
        }



    }

我只有一个DataTable。 enter image description here

1 个答案:

答案 0 :(得分:1)

主要问题是您希望将分层​​数据转换为关系数据,并且无法轻松完成此操作。例如,在您当前的分层模型中,每List存储availableHotels RootObject,但在关系数据库(如DataSet)中,您应存储所有availableHotels RootObjectId然后在单独的表中添加一个RootObject列到该表中,并为每一行设置availableHotels对象的id,该对象是存储在using中的return的父对象。这一行。等等其他数据。

这需要一种与您在代码中使用的方法完全不同的方法。

当然,如果您想要{{1}}并且在方法之外使用它们,那么您不应该将{{1}}放在新创建的对象上,因为它会处理它们。