2012-11-28 12 views
7

वर्ग मैं लोग इनएंटिटी को DataTable

यहाँ हम का उपयोग इकाई की रूपरेखा तो कल्पना हम तालिका mng_users (स्ट्रिंग usr_name, पूर्णांक usr_id) itentity के लिए संबंधित वर्ग बनाने राशि को बचाने के लिए एक सामान्य वर्ग बनाने के लिए कोशिश कर रहा हूँ)

वहाँ toDataTable विधि एक datatable में इकाई परिवर्तित करने को लागू करने के लिए एक रास्ता है (एक नहीं सूची, 1 पंक्ति होने केवल) तो मैं कुछ इस तरह कर सकते हैं:

mng_users1 और mng_users इकाई वर्ग के रूप में mng_users2 होने (दोनों एक ही आईडी के साथ लेकिन diff नाम)

कॉल विधि "savelog (mng_users1, mng_users2);"

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 
    } 

उत्तर

9

कुछ नीचे दिए गए कोड काम करना चाहिए की तरह: और निम्नलिखित कोड है। यह गुणों के आधार पर tweaked की आवश्यकता हो सकती है कि गुण private/protected हैं और यदि सार्वजनिक संपत्तियों में से कोई भी अनुक्रमित है, लेकिन यह आपको प्रारंभ करना चाहिए।

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

हाय, यह वास्तव में कुछ tweaks के साथ काम किया ... लेकिन मैं ToDataTable विधि का उपयोग नहीं कर सका, मुझे इसे SaveLog विधि में उपयोग करना पड़ा। – user1859887

+0

आप हमेशा इनलाइन कोड से एक विधि निकाल सकते हैं। मैंने देखा कि मैं विधि के वापसी प्रकार को सेट करना भूल गया था। यह अब काम करना चाहिए। –

+0

@ user1859887 जो ** SaveLog ** है? – Kiquenet

5

ऊपर नमूना मेरे सुधार:

  • बदली हुई वाक्य रचना विस्तार विधि के लिए
  • अब विस्तार विधि एक DataTable
  • करने के लिए मौजूदा बदल देता वस्तु इकाई सूची 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; 
    }