2012-11-28 9 views
7

Sto cercando di fare una classe generica per salvare il loginEntity classe per Datatable

Qui usiamo Entity Framework quindi immaginare abbiamo tavolo mng_users (usr_name stringa, int usr_id) creando la rispettiva classe per itentity)

c'è un modo per implementare il metodo toDataTable convertire l'entità in una datatable (non una lista, avente da 1 fila solo) in modo che possa fare qualcosa di simile:

avente mng_users1 e mng_users2 come classe mng_users entità (entrambi con lo stesso id ma nome diff)

metodo di chiamata "savelog (mng_users1, mng_users2);" e fare il seguente codice:

private DataTable toDataTable(Object T) 
    { 
     DataTable vDataTable = new DataTable(); 

     //AddColums here 
     //AddRow with the respective values here 

     return vDataTable; 
    } 

    public void savelog(Object newObject, Object oldObject) 
    { 

     DataTable newvalue, oldvalue; 

     newvalue = toDataTable(newObject); 
     oldvalue = toDataTable(oldObject); 

     string FieldNames = string.Empty, FieldValuesFrom = string.Empty, FieldValuesTo = string.Empty; 
     foreach (DataColumn item in newvalue.Columns) 
       { 
        if (newvalue.Rows[0][item].ToString() != oldvalue.Rows[0][item].ToString()) 
        { 
         FieldNames += (FieldNames.Length > 0 ? " | " : string.Empty) + item.ColumnName; 
         FieldValuesFrom += (FieldValuesFrom.Length > 0 ? " | " : string.Empty) + newvalue.Rows[0][item].ToString(); 
         FieldValuesTo += (FieldValuesTo.Length > 0 ? " | " : string.Empty) + oldvalue.Rows[0][item].ToString(); 
        } 

       } 
     // Save log to sql code here 
    } 

risposta

9

Qualcosa come il codice qui sotto dovrebbe funzionare. Potrebbe essere necessario modificarlo a seconda che le proprietà siano private/protected e se una qualsiasi delle proprietà pubbliche sia indicizzata, ma dovrebbe iniziare.

private DataTable ToDataTable<T>(T entity) where T : class 
{ 
    var properties = typeof(T).GetProperties(); 
    var table = new DataTable(); 

    foreach(var property in properties) 
    { 
     table.Columns.Add(property.Name, property.PropertyType); 
    } 

    table.Rows.Add(properties.Select(p => p.GetValue(entity, null)).ToArray()); 
    return table; 
} 
+0

Salve, ha funzionato con alcune modifiche ... ma non potevo usare il metodo ToDataTable, dovevo usarlo nel metodo SaveLog. – user1859887

+0

puoi sempre estrarre un metodo dal codice inline. Ho visto che ho dimenticato di impostare il tipo di ritorno del metodo. dovrebbe funzionare ora. –

+0

@ user1859887 che è ** SalvaLog **? – Kiquenet

5

mio miglioramento al campione di cui sopra:

  • sintassi modificato in metodo di estensione
  • ora metodo di estensione converte lista oggetto entità esistente in un DataTable
  • aggiunto il supporto per i tipi di proprietà Nullable

    public static DataTable ToDataTable<T>(this IEnumerable<T> entityList) where T : class 
    { 
        var properties = typeof(T).GetProperties(); 
        var table = new DataTable(); 
    
        foreach (var property in properties) 
        { 
         var type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType; 
         table.Columns.Add(property.Name, type); 
        } 
        foreach (var entity in entityList) 
        { 
         table.Rows.Add(properties.Select(p => p.GetValue(entity, null)).ToArray()); 
        } 
        return table; 
    }