2009-12-14 4 views
0

У нас есть приложение mish-mash с устаревшим модулем, который по-прежнему использует DataSets, DataViews и DataTables, но у нас есть большая часть баз данных ORMed, кроме DB для этого модуля. Мне было интересно, если кто-то может дать мне указатели о том, как идти о построении расширений какОбъект DataView или DataSet или DataTable и обратно к объекту

/* generates a dataset called CustomerDS with 
DataTable called Customer uses property names as DataColumn name */ 
var dataset =_customer.AsDataSet(); 
/* Converts the dataset to required object or 
throws exception if its cant convert*/ 
var customerEntity = _dataset.ToObject<Customer>(); 

Я не знаю, когда мы получим время для работы над другими слоями приложения и освободить его от DataSets. Я мог бы казаться сумасшедшим, но это была просто мысль. Я получаю кошмары, когда мне нужно поддерживать/исправлять это приложение.

+1

Из отдельных таблиц , возможно, что-то вроде: http://stackoverflow.com/questions/564366/generic-list-to-datatable –

+1

И в другом d irection: http://stackoverflow.com/questions/545328/datatable-to-generic-list-memory-leak –

ответ

1

Вы можете использовать отражение, например:

class Program { 
     public static void Start(string[] args) { 
      var john = new Customer { 
       CustomerID = Guid.NewGuid(), 
       CustomerName = "John", 
       CustomerCode = "J-O" 
      }; 

      var tblJohn = john.ToDataTable(); 
      var clonedJohn = tblJohn.Rows[0].ToDataObject<Customer>(); 
     } 
} 

[AttributeUsage(AttributeTargets.Property)] 
public class DataColumnAttribute : Attribute { } 
public class Customer { 
    [DataColumn] 
    public Guid CustomerID { get; set; } 

    [DataColumn] 
    public string CustomerName { get; set; } 

    [DataColumn] 
    public string CustomerCode { get; set; } 
} 

public static class DataObjectExtensions { 
    public static T ToDataObject<T>(this DataRow dataRow) where T : new() { 
     var dataObject = Activator.CreateInstance<T>(); 
     var tpDataObject = dataObject.GetType(); 

     foreach (var property in tpDataObject.GetProperties()) { 
      var attributes = property.GetCustomAttributes(typeof(DataColumnAttribute), true); 
      if (null != attributes && attributes.Length > 0) { 
       if (property.CanWrite) { 
        DataColumn clm = dataRow.Table.Columns[property.Name]; 
        if (null != clm) { 
         object value = dataRow[clm]; 
         property.SetValue(dataObject, value, null); 
        } 
       } 
      } 
     } 

     return dataObject; 
    } 
    public static DataTable ToDataTable(this object dataObject) { 
     var tpDataObject = dataObject.GetType(); 

     DataTable tbl = new DataTable(); 
     DataRow dataRow = tbl.NewRow(); 
     foreach (var property in tpDataObject.GetProperties()) { 
      var attributes = property.GetCustomAttributes(typeof(DataColumnAttribute), true); 
      if (null != attributes && attributes.Length> 0) { 
       if (property.CanRead) { 
        object value = property.GetValue(dataObject, null); 
        DataColumn clm = tbl.Columns.Add(property.Name, property.PropertyType); 
        dataRow[clm] = value; 
       } 
      } 
     } 

     tbl.Rows.Add(dataRow); 
     tbl.AcceptChanges(); 
     return tbl; 
    } 
} 
0

Вы можете использовать это, чтобы получить объект из таблицы

public static class Extensions 
    { 
     public static List<T> ToList<T>(this DataTable table) where T : new() 
     { 
      IList<PropertyInfo> properties = typeof(T).GetProperties().ToList(); 
      List<T> result = new List<T>(); 

      foreach (var row in table.Rows) 
      { 
       var item = CreateItemFromRow<T>((DataRow)row, properties); 
       result.Add(item); 
      } 

      return result; 
     } 

     private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new() 
     { 
      T item = new T(); 
      foreach (var property in properties) 
      { 
       if (property.PropertyType == typeof(System.DayOfWeek)) 
       { 
        DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString()); 
        property.SetValue(item,day,null); 
       } 
       else 
       { 
        property.SetValue(item, row[property.Name], null); 
       } 
      } 
      return item; 
     } 
    } 

данных и использовать его как этот

List<Employee> lst = ds.Tables[0].ToList<Employee>(); 
Смежные вопросы