2012-05-30 37 views
15

मैं एक नई परियोजना पर काम कर रहा हूं जिसे Linq To SQL का उपयोग करने की आवश्यकता है। मुझे एक सामान्य या पुन: प्रयोज्य Linq to SQL कक्षा बनाने के लिए कहा गया है जिसका उपयोग संग्रहीत प्रक्रियाओं को निष्पादित करने के लिए किया जा सकता है।संग्रहित प्रक्रियाओं के लिए एसक्यूएल में पुन: प्रयोज्य लिंक बनाएं

ADO.Net में मुझे पता था कि मैं कैसे चलाने की आवश्यकता सिर्फ मैं क्या निष्पादित करने के लिए चाहता था और मैं प्रत्येक क्वेरी के लिए विभिन्न तार प्रेषित कर सकता है की एक स्ट्रिंग में पारित करके यह करने के लिए:

SqlCommand cmd = new SqlCommand("myStoredProc", conn); // etc, etc 

मैं के साथ संघर्ष कर रहा हूँ Linq To SQL में कुछ ऐसा कैसे बनाएं, यदि यह भी संभव हो। मैंने .dbml फ़ाइल बनाई है और इसमें मेरी संग्रहीत प्रक्रिया को जोड़ा है। नतीजतन, मैं नीचे दिए गए कोड का उपयोग कर परिणाम वापस कर सकते हैं:

public List<myResultsStoreProc> GetData(string connectName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.myResultsStoreProc(); 

    return query.ToList(); 
} 

कोड काम करता है लेकिन उन्होंने मुझे एक विधि है कि जो कुछ संग्रहीत प्रक्रिया मैं यह बता चलाने के लिए वापस आ जाएगी बनाना चाहते हैं। मैंने ऑनलाइन खोज की है और इसके बारे में सहयोगियों से बात की है और पुन: प्रयोज्य संग्रहीत प्रो वर्ग बनाने के लिए एक रास्ता खोजने में असफल रहा है।

तो संग्रहीत प्रोसेस निष्पादित करने के लिए पुन: प्रयोज्य Linq to SQL कक्षा बनाने का कोई तरीका है?

संपादित करें:

मैं क्या देख रहा हूँ अगर वहाँ निम्नलिखित की तरह कुछ करने के लिए एक रास्ता है है?

public List<string> GetData(string connectName, string procedureName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.procedureName(); 

    return query.ToList(); 
} 

मैं Linq To Sql पर MSDN docs की समीक्षा की है और इन IEnumerable में मेज दिखा रहे हैं:

IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    @"select c1.custid as CustomerID, c2.custName as ContactName 
     from customer1 as c1, customer2 as c2 
     where c1.custid = c2.custid" 
); 

मैं कुछ बहुत सामान्य है, जहां मैं संग्रहीत की एक स्ट्रिंग मूल्य भी भेज सकता रहा हूँ proc कि मैं निष्पादित करना चाहता हूँ। यदि यह संभव नहीं है, तो क्या कोई दस्तावेज है कि इसे इस तरह क्यों नहीं किया जा सकता है? मैं साबित करने के लिए कारण है कि हम Linq To Sql

+0

आप संग्रहित प्रक्रियाओं है कि आप .dbml फ़ाइल में मॉडलिंग की है नहीं हो सकता है पर अमल करने की जरूरत है? और क्या आप उन संस्थाओं को वापस करना चाहते हैं जो आपके .dbml में मैप किए गए हैं? – CodingGorilla

+0

उन्हें सबसे अधिक संभावना है .dbml में मैप किया जाएगा, लेकिन मुझे लगता है कि ऐसा कोई मामला हो सकता है जहां यह – Taryn

+0

नहीं था। LINQ से SQL का उपयोग नहीं किया जाना चाहिए। आप सिस्टम के खिलाफ काम कर रहे हैं। काम करने का प्रयास करें क्योंकि इसका इस्तेमाल किया जाना है। – usr

उत्तर

16

DataContext.ExecuteCommand वह नहीं है जो आप खोज रहे हैं, क्योंकि यह केवल एक int मान देता है। इसके बजाय आप DataContext.ExecuteQuery है, जो संग्रहीत प्रक्रिया को निष्पादित करने और डेटासेट लौटने में सक्षम है।

मैं आपके डीबीएमएल के लिए आंशिक कक्षा बनाउंगा जिसमें इस फ़ंक्शन को संग्रहीत किया जाए।

public List<T> GetDataNoParams(string procname) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname); 

    return query.ToList(); 
} 

public List<T> GetDataParams(string procname, Object[] parameters) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname, parameters); 

    return query.ToList(); 
} 

एक संग्रहीत प्रक्रिया आप क्या करेंगे कॉल करने के लिए:

GetDataNoParams("myprocedurename"); 

या

GetDataParams("myotherprocedure {0}, {1}, {2}", DateTime.Now, "sometextValue", 12345); 

या

GetDataParams("myotherprocedure var1={0}, var2={1}, var3={2}", DateTime.Now, "sometextValue", 12345); 

आप कोई वापसी मान के साथ प्रक्रियाओं कॉल करने के लिए चाहते हैं कि यह भी काफी आसान है, क्योंकि मुझे यकीन है कि वाई कहां देख सकता है, एक नई विधि बनाकर जो कुछ भी स्टोर/वापस नहीं करता है।

प्रेरणा http://msdn.microsoft.com/en-us/library/bb361109(v=vs.90).aspx से आई थी।

+0

क्या डीबीएमएल फ़ाइल 'ExecuteQuery ' विधि को बताएगी कि 'टी' क्या है ताकि डेटा ऑब्जेक्ट इंस्टेंस में मैश किए जा सके? – bluevector

+0

नहीं, आप इसे बताते हैं कि जब आप इसे कॉल करते हैं तो यह क्या होता है। मेरे उदाहरण मानते हैं कि आपके पास पहले से ही संग्रहीत प्रक्रियाओं के लिए रिटर्न प्रकारों पर मैप किए गए ऑब्जेक्ट्स हैं। इसलिए यदि आपके पास एक संग्रहीत प्रक्रिया है जो ग्राहकों को लौटाती है और आपके पास ग्राहक ऑब्जेक्ट प्रकार है तो ग्राहक के लिए टी – Peter

+0

गोटो में पास करें। इसलिए हम 'IQueryable'-ify संग्रहीत प्रोसेस की कोशिश नहीं कर रहे हैं और कुछ भी सर्वज्ञानी होने की आवश्यकता नहीं है। – bluevector

2

में निष्पादित करने के लिए अपने प्रश्न का सबसे सरल जवाब है कि आप अपने MyDataContext की Connection संपत्ति हड़पने कर सकते हैं प्रक्रिया के नाम की एक स्ट्रिंग मान पारित नहीं कर सकते हैं और बना सकते हैं और अपने खुद के SqlCommand रों अमल की जरूरत है जैसे आप सीधे ADO.Net में करेंगे। मुझे यकीन नहीं है कि यह आपके उद्देश्यों की पूर्ति करेगा, खासकर यदि आप अपने LINQ से SQL मॉडल में इकाइयों को पुनर्प्राप्त करना चाहते हैं।

यदि आप मॉडल से इकाइयों को वापस करना चाहते हैं, तो DataContext.ExecuteCommand विधि पर एक नज़र डालें।

+0

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

+0

@bluefeet पीटर के जवाब देखें, उसे कुछ अच्छे उदाहरण मिल गए हैं। – CodingGorilla

0

जब हम अपनी .dbml फ़ाइल में कोई तालिका या संग्रहीत प्रसंस्करण छोड़ते हैं तो यह अपनी कक्षा बनाता है जो डेटा परत और हमारे व्यावसायिक तर्क से संचार करता है।

लिंक से एसक्यूएल में हमारे पास .dbml फ़ाइल में मौजूद स्टोर्डप्रोसेसर या टेबल्स मौजूद हैं अन्यथा लिंक से SQL में जेनेरिक विधि को कॉल करने के लिए कोई तरीका नहीं है, ताकि एक विधि को अपना नाम पास करके संग्रहीत प्रक्रिया को कॉल किया जा सके।

लेकिन ADO.Net में हम यह कर सकते हैं (जैसे क्या आप जानते हैं)

SqlCommand cmd = new SqlCommand("myStoredProc", conn); 
संबंधित मुद्दे