यदि आप शायद इसे ठीक करने के बाद इसका उपयोग कर रहे हैं, लेकिन यदि आप इसे बहुत कुछ करेंगे तो आपको कुछ और सामान्य सामान करने की कोशिश करनी चाहिए। मैंने DataTable
के लिए एक एक्सटेंशन विधि लिखने के बारे में एक ब्लॉग पोस्ट लिखा है जो ऑब्जेक्ट्स की एक सूची बनाता है। यह प्रथा के अनुसार काम करता है उस वस्तु में गुण एक ही नाम होना चाहिए के रूप में जमा की प्रक्रिया में कॉलम (मैं संग्रहीत प्रक्रिया में नाम बदल जाएगा अगर मैं कर सकता):
public static class DataTableExtensions
{
public static IList<T> ToList<T>(this DataTable table) where T : new()
{
IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
IList<T> result = new List<T>();
foreach (var row in table.Rows)
{
var item = CreateItemFromRow<T>((DataRow)row, properties);
result.Add(item);
}
return result;
}
public static IList<T> ToList<T>(this DataTable table, Dictionary<string, string> mappings) where T : new()
{
IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
IList<T> result = new List<T>();
foreach (var row in table.Rows)
{
var item = CreateItemFromRow<T>((DataRow)row, properties, mappings);
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)
{
property.SetValue(item, row[property.Name], null);
}
return item;
}
private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties, Dictionary<string, string> mappings) where T : new()
{
T item = new T();
foreach (var property in properties)
{
if(mappings.ContainsKey(property.Name))
property.SetValue(item, row[mappings[property.Name]], null);
}
return item;
}
}
अब आप कॉल कर सकते हैं
var items = dt.ToList<Item>();
या
var mappings = new Dictionary<string,string>();
mappings.Add("ItemId", "item_id");
mappings.Add("ItemName ", "item_name");
mappings.Add("Price ", "price);
var items = dt.ToList<Item>(mappings);
ब्लॉग पोस्ट यहाँ है: http://blog.tomasjansson.com/2010/11/convert-datatable-to-generic-list-extension
ऐसे कई तरीके हैं जिसमें आप इस विस्तार कर सकते हैं कर रहे हैं, तो आप विस्तार बता कैसे इस तरह नाम से मेल करने की जरूरत नहीं है में स्तंभों को मैप करने, मानचित्रण शब्दकोश किसी तरह शामिल हो सकते हैं। या आप मैपिंग में उन संपत्ति नामों की एक सूची जोड़ सकते हैं जिन्हें आप बाहर करना चाहते हैं।
अपडेट: आपकी ऑब्जेक्ट (Item
) आपके निर्माण के लिए एक डिफ़ॉल्ट निर्माता होना चाहिए अन्यथा निजी विधि इसे बनाने में सक्षम नहीं होगी। जिस तरह से समाधान काम करता है, ऑब्जेक्ट के मूल्यों को सेट करने के लिए प्रतिबिंब से प्राप्त गुणों का उपयोग करने से पहले ऑब्जेक्ट बनाने के लिए होता है।
अपडेट 2: मैंने मैपिंग्स डिक्शनरी के साथ हिस्सा जोड़ा लेकिन मैंने इसे स्वयं नहीं किया है, इसलिए यह संकलित नहीं हो सकता है। हालांकि, अवधारणा वहां है और मुझे लगता है कि यह काम करता है।
'लोड()' अंदर मद वर्ग क्यों है? –
क्योंकि यह इसे विभिन्न वर्ग के तहत रखने के लिए बहुत मेहनतजनक लग रहा है। मेरे पास इस तरह के कई मामले हैं और मेरे पास सौ वर्ग नहीं हो सकते हैं जो केवल क्वेरी परिणाम देता है। – Naor
@Nor इसे कम से कम स्थिर बनाते हैं .. – nawfal