2012-11-28 13 views
7

Próbuję zrobić rodzajowe klasy, aby zapisać logPodmiot klasa DataTable

Tutaj używamy Entity Framework więc sobie wyobrazić, mamy tabeli mng_users (string, int usr_id usr_name) tworząc odpowiednią klasę dla itentity)

czy istnieje sposób wdrożyć toDataTable metodę konwersji podmiotu do DataTable (nie na listę, posiadający 1 wiersz tylko), więc mogę zrobić coś takiego:

mający mng_users1 i mng_users2 jako klasy podmiotu mng_users (oba o tej samej nazwie id, ale o innej nazwie)

metoda połączenia "savelog (mng_users1, mng_users2);" i wykonać następujący kod:

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 
    } 

Odpowiedz

9

coś jak poniżej kod powinien działać. Może być konieczne zmodyfikowanie w zależności od tego, czy właściwości są zmienione i czy któraś z właściwości publicznych jest zindeksowana, ale powinna zacząć.

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

Witam, zadziałało to z kilkoma poprawkami ... ale nie mogłem użyć metody ToDataTable, musiałem użyć jej w metodzie SaveLog. – user1859887

+0

zawsze można wyodrębnić metodę z kodu wbudowanego. Widziałem, że zapomniałem ustawić typ zwrotu metody. teraz powinno działać. –

+0

@ user1859887 czyli ** SaveLog **? – Kiquenet

5

Moja poprawa powyższej próbki:

  • zmieniony składni metody rozszerzenia
  • teraz metodę rozszerzenia przekształca istniejące listy podmiot przedmiot do DataTable
  • dodano wsparcie dla pustych rodzaje nieruchomości

    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; 
    } 
    
Powiązane problemy