DataTable Convert to List C#



Merhaba, bu yazımızda var olan bir veri modelini DataTable’e dönüştürmeyi ele alacağız. C# masaüstü uygulamalarıyla uğraşan arkadaşların bazen ihtiyaç duyduğu bir işlemdir. Örnek vermek gerekirse GridView’de veri göstermek gerekirken DataTable nesnesine başvurma durumunda kalabiliriz ve elimizde bulunan veri modelini rahatlıkla DataTable dönüştürebilir.

Şimdi kodlarımızı yazmaya başlayalım. ListEntityToDataTable adında bir extension classını oluşturalım ve bu classımız List<T> türünde bir liste parametre alıyor. Örneğim elimizde List<Customer> türünde verilerimiz var. Bu verileri aşağıdaki extensionu kullanarak DataTable’e dönüştürebiliriz.

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

Yukarıdaki metodu şu şekilde kullanabiliriz.

var dataTable=listCustomer.ListEntityToDataTable();

Peki elimizdeki DataTable verisini nasıl bir veri modeline dönüştürebilir? Onu da aşağıdaki metodu kullanarak rahatlıkla dönüştürebiliriz.

 public static List<T> DataTableToListEntity<T>(DataTable dataTable)
        {
            var columnNames = dataTable.Columns.Cast<DataColumn>()
                .Select(c => c.ColumnName)
                .ToList();
            var properties = typeof(T).GetProperties();
            return dataTable.AsEnumerable().Select(row =>
            {
                var objT = Activator.CreateInstance<T>();
                foreach (var pro in properties)
                {

                    if (columnNames.Contains(pro.Name))
                    {
                        if (pro.PropertyType.IsGenericType &&
                            pro.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                        {
                            Type convertTo = Nullable.GetUnderlyingType(pro.PropertyType) ?? pro.PropertyType;
                            var value = convertTo.ToString().ToLower().Contains("dbnull") ? null : row[pro.Name];
                            try
                            {
                                value = Convert.ChangeType(value, convertTo, null);
                            }
                            catch
                            {
                                continue;
                            }
                            pro.SetValue(objT, value);
                        }
                    }
                }
                return objT;
            }).ToList();
        }

Kullanımı şu şekilde

var listCustomer=dataTable.DataTableToListEntity<Customer>();

Leave a Reply