2012-06-30 18 views
9

वर्तमान में, मैं कुछ इस तरह उपयोग कर रहा हूँ:मैं वस्तुओं पर एक एसक्यूएल क्वेरी के परिणामों को कैसे मैप कर सकता हूं?

try 
    { 
     dr = SQL.Execute(sql); 

     if(dr != null) { 
     while(dr.Read()) { 
      CustomObject c = new CustomObject(); 
      c.Key = dr[0].ToString(); 
      c.Value = dr[1].ToString(); 
      c.Meta = dr[2].ToString(); 
      customerInfo.CustomerList.Add(c); 
     } 
     } 
     else 
     { 
      customerInfo.ErrorDetails="No records found"; 
     } 
मुझे के बजाय

मैन्युअल assigments कर रही है, वहाँ इस मानचित्रण सीधे करने के लिए एक रास्ता है (मान लेते हैं कि स्तंभ नाम फ़ील्ड नाम के साथ मेल)।

एक आवश्यकता यह है कि मैं एसक्यूएल प्रश्नों का उपयोग करने के अपने वर्तमान दृष्टिकोण से ऐसा करना चाहता हूं, न कि शुद्ध LINQ आधारित दृष्टिकोणों का उपयोग करके। एक के लिए, एसक्यूएल प्रश्न काफी बड़े हैं, जटिल जॉइन शामिल हैं और पूरी तरह से परीक्षण किया गया है इसलिए मैं इस समय और अधिक बग पेश नहीं करना चाहता हूं। कोई सुझाव?

+2

ध्यान दें कि आप कस्टम एसक्यूएल प्रश्नों के साथ LINQ का उपयोग कर सकते हैं, और यह स्वचालित रूप से आपके द्वारा प्रदान किए गए जेनेरिक ऑब्जेक्ट प्रकार पर क्वेरी परिणाम में फ़ील्ड को मैप कर देगा। देखें [** 'DataContext.ExecuteQuery' **] (http://msdn.microsoft.com/en-us/library/bb361109.aspx) – mellamokb

+0

@mellamokb: क्या आप मुझे दिखा सकते हैं? या कम से कम मुझे कुछ संसाधन के लिए इंगित करें या शायद मुझे क्या खोजना चाहिए? – Legend

+0

मैंने जो लिंक जोड़ा है उसे देखें, जो आपको आवश्यक विशिष्ट विधि है। उस पृष्ठ पर भी उदाहरण हैं। – mellamokb

उत्तर

4

एक आसान समाधान आपके CustomObject के लिए एक कन्स्ट्रक्टर बनाना होगा जो DataRow (उदाहरण से, यदि यह एक और वर्ग है, तो कृपया मुझे सही करें)।

और अपने नए कन्स्ट्रक्टर में, जैसा कि आप अपने उदाहरण में करते हैं।

public CustomObject(DataRow row) 
{ 
    Key = row[0].ToString(); 
    // And so on... 
} 

का एक दूसरा तरीका (Passing arguments to C# generic new() of templated type से कोड लिया) जेनरिक पेश करते हैं, और

उदाहरण अपने एसक्यूएल श्रेणी में एक नया कार्य बनाने के लिए होगा:

// This function should reside in your SQL-class. 
public IEnumerable<T> ExecuteObject<T>(string sql) 
{ 
    List<T> items = new List<T>(); 
    var data = ExecuteDataTable(sql); // You probably need to build a ExecuteDataTable for your SQL-class. 
    foreach(var row in data.Rows) 
    { 
     T item = (T)Activator.CreateInstance(typeof(T), row); 
     items.Add(item); 
    } 
    return items; 
} 

उदाहरण उपयोग:

public IEnumerable<CustomObject> GetCustomObjects() 
{ 
    return SQL.ExecuteObject<CustomObject>("SELECT * FROM CustomObject"); 
} 

मैंने लिंककैड में इस कोड का परीक्षण किया है, इसे काम करना चाहिए।

3

आप अपनी आवश्यकता के लिए एक सामान्य विधि बनाकर प्राप्त कर सकते हैं। इसके अलावा आप डेटा तालिका के विस्तार के रूप में अपनी नई विधि बना सकते हैं।

public static List<T> ToList<T>(this DataTable table) where T : class, new() 
{ 
    try 
    { 
     List<T> list = new List<T>(); 

     foreach (var row in table.AsEnumerable()) 
     { 
      T obj = new T(); 

      foreach (var prop in obj.GetType().GetProperties()) 
      { 
       try 
       { 
        PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name); 
        propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null); 
       } 
       catch 
       { 
        continue; 
       } 
      } 

      list.Add(obj); 
     } 

     return list; 
    } 
    catch 
    { 
     return null; 
    } 
} 

}

उपयोग:

DataTable dtCustomer = GetCustomers(); 
    List<CustomObject> CustomObjectList = dtCustomer.ToList<CustomObject>(); 
2

आप MicroORMs ध्यान देना चाहिए। नियमित ओआरएम के विपरीत, जो एक एसडीएल प्रदान करता है, आपको इसका उपयोग करना होगा, माइक्रोओआरएम आपको अपने स्वयं के एसक्यूएल प्रश्नों का उपयोग करने की अनुमति देता है और केवल एसक्यूएल परिणाम सेट से सी # ऑब्जेक्ट्स और सी # ऑब्जेक्ट्स से एसक्यूएल पैरामीटर में मैपिंग प्रदान करता है।

मेरा पसंदीदा PetaPoco है, जो एक क्वेरी बिल्डर भी प्रदान करता है जो आपके स्वयं के एसक्यूएल का उपयोग करता है लेकिन पैरामीटर संख्याओं के कुछ साफ-सुथरा हेरफेर करता है।

0

निम्न फ़ंक्शन एक SQL स्ट्रिंग और ऑब्जेक्ट स्वीकार करता है, इसके लिए ऑब्जेक्ट को प्रत्येक कथन के लिए चयन कथन में एक संपत्ति की आवश्यकता होती है। वस्तु तत्काल होना चाहिए।

सार्वजनिक वस्तु SqlToSingleObject (स्ट्रिंग sSql, वस्तु ओ) {

 MySql.Data.MySqlClient.MySqlDataReader oRead; 
     using (ConnectionHelper oDb = new ConnectionHelper()) 
     { 
      oRead = oDb.Execute(sSql); 
      if (oRead.Read()) 
      { 

       for (int i = 0; i < oRead.FieldCount; i++) 
       { 

        System.Reflection.PropertyInfo propertyInfo = o.GetType().GetProperty(oRead.GetName(i)); 
        propertyInfo.SetValue(o, Convert.ChangeType(oRead[i], propertyInfo.PropertyType), null); 
       } 
       return o; 
      } 
      else 
      { 
       return null; 

      } 

     } 

    } 
+0

उस बिंदु का क्या मतलब है? यदि आप सभी poperties बनाने जा रहे हैं, तो न केवल वस्तु का निर्माण क्यों करें। – MattE

1

धारणा: आप केवल क्रमबद्धता या साधारण तदर्थ उत्पादन के लिए वस्तुओं की आवश्यकता है।

आप इस तरह ExpandoObject और SqlDataReader.GetSchemaTable() उपयोग कर सकते हैं:

private IEnumerable<dynamic> ReaderToAnonymmous(SqlCommand comm) { 
     using (var reader = comm.ExecuteReader()) { 
      var schemaTable = reader.GetSchemaTable(); 

      List<string> colnames = new List<string>(); 
      foreach (DataRow row in schemaTable.Rows) { 
       colnames.Add(row["ColumnName"].ToString()); 
      } 

      while (reader.Read()) { 
       var data = new ExpandoObject() as IDictionary<string, Object>; 
       foreach (string colname in colnames) { 
        var val = reader[colname]; 
        data.Add(colname, Convert.IsDBNull(val) ? null : val); 
       } 

       yield return (ExpandoObject)data; 
      } 
     } 
    } 

हालांकि तेजी से समाधान पोस्ट कर रहे हैं (मैं तदर्थ एसक्यूएल/रीडर परिणाम/आउटपुट के लिए इस रूप में वैकल्पिक आलसी दृष्टिकोण तैनात)।

+0

यह बहुत ही बढ़िया है, ठीक वही है जो मैं ढूंढ रहा हूं। मैं कंसोल एप्लिकेशन हूं जो संग्रहीत प्रक्रियाओं से एक्सेल में रिपोर्ट जेनरेट करता है, और कोड के इस टुकड़े के साथ मुझे एप्लिकेशन के भीतर प्रक्रियाओं को मैप करने की ज़रूरत नहीं है। धन्यवाद। – v1n1akabozo

संबंधित मुद्दे

 संबंधित मुद्दे