2010-07-06 26 views
8

किसी को भी पता है कि अगर यह एक CLR संग्रहीत प्रक्रिया अंदर एक DataTable पर LINQ का उपयोग करना संभव (और कैसे) नहीं है?LINQ संग्रहित प्रक्रिया

मैं तथापि PROJ एक मानक WinForms में एक DataTable पर LINQ का उपयोग कर कोई समस्या नहीं; मैं SQL2005 पर VS2010 में एक डाटाबेस परियोजना का उपयोग कर रहा है और एक संग्रहित प्रक्रिया बनाने:

(सरलीकृत सूची)

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void ProcessReOrder() 
{  
    using (SqlConnection conn = new SqlConnection("context connection=true")) { 
     SqlDataAdapter adapter = new SqlDataAdapter("database.dbo.OtherSp", conn); 
     DataTable table = new DataTable("ReOrder"); 
     adapter.Fill(table); 

     var query = from t in table.AsEnumerable() 
        where t.Field<int>("Id") > 1000 select t.Field<int>("Id"); 

    etc..... 
} 

समस्या, है AsEnumerable() एक विस्तार विधि है और हालांकि मैंने को का उपयोग LINQ के संदर्भ में मिला है; यह अभी भी नहीं मिला है।

Google को खोजना, मुझे विश्वास है कि यह फ्रेमवर्क में दफन किए गए LINQ इकाई संदर्भ (डीएलएल) का उपयोग करने के साथ करना है, क्योंकि यह एक डीबी परियोजना है, इसलिए हमें किसी भी डीएलएल पर संदर्भ जोड़ने नहीं हैं प्रणाली; ऐड रेफरेंस बॉक्स कुछ चुनिंदा असेंबली तक ही सीमित है और ब्राउज़ नहीं है ... बटन।

प्रदर्शन के मुद्दों आदि की परवाह किए बिना, मैं नहीं मेरी नेट संग्रहीत proc अंदर ADO/T-SQL का एक बहुत रोल सौंपने के लिए चाहते हैं; मैं LINQ और कोड को विभिन्न परतों/डीबी प्लेटफ़ॉर्म पर स्थानांतरित करने की क्षमता पसंद करता हूं। क्या LINQ एक स्टोरेज प्रो के अंदर डेटाटेबल पर समर्थित है (मैं अनुमान नहीं लगा रहा हूं) या क्या मैं यहां बेस से पूरी तरह से बंद हूं और टी-एसक्यूएल के साथ कोड करना चाहिए?

+0

क्यों नहीं तुम सिर्फ अपने खुद के 'AsEnumerable' विधि लिखना चाहते हैं? यह एक लाइनर है: 'foreach (tableRow में tableRow r) उपज रिटर्न आर;' वैसे, 'AsEnumerable'' System.Data.DataSetExtensions' में है। – mquander

+0

यदि आप LINQ-TO-SQL या Entity Framework जैसे ओआरएम का उपयोग करते हैं तो आप संग्रहीत प्रक्रियाओं को जोड़ सकते हैं और उन्हें एक विधि कॉल की तरह कॉल कर सकते हैं। –

+0

@mquander, मुझे संदेह है कि यह मेरा एकमात्र विकल्प होगा। मैं एमएस 'LINQ कार्यान्वयन के कुछ हिस्सों को दोबारा कोड करने की कोशिश नहीं कर रहा हूं लेकिन इसका उपयोग "जैसा है" - विशेष रूप से कोड सीएलआर संग्रहीत प्रक्रिया के बाहर एक अतिरिक्त इम्प्ले के बिना काम करता है। आप सही हैं, यह इकाई नामस्थान नहीं है लेकिन System.Data.DataSetExtensions (मेरी गलती), केवल डीबी परियोजना से डीएलएल का संदर्भ नहीं दे सकता है। ऐसा लगता है कि एमएस आपको केवल एससी सर्वर पर तैनात एसी का उपयोग करने देगा। धन्यवाद। –

उत्तर

5

मुझे यकीन नहीं है कि यह आपको सभी तरह से प्राप्त करेगा, हालांकि यह सिस्टम प्राप्त करेगा। डेटा.डेटासेट एक्सटेंशन SQL सर्वर 2008 में स्थापित है ताकि आप इसे अपने SQL CLR प्रोजेक्ट से संदर्भित कर सकें। ध्यान दें कि मैं sysadmin निश्चित सर्वर भूमिका के सदस्य के रूप में लॉग इन था।

पहले, मैं डेटाबेस असुरक्षित विधानसभा लोड करने के लिए तैयार पाने के लिए था। मैं ALTER DATABASE dbname SET TRUSTWORTHY ON; तो मैं ALTER AUTHORIZATION ON database::dbname TO sa; साथ सा करने के लिए डेटाबेस के मालिक सेट मार डाला।

अगला, मैंने फ़ाइल को एक होल्डिंग निर्देशिका (सी: \ temp) से सी: \ विंडोज \ असेंबली \ GAC_MSIL \ System.Data.DataSetExtensions से कॉपी करके मेरे वर्कस्टेशन पर जीएसी से असेंबली के v3.5 निकाले। \ 3.5.0.0__b77a5c561934e089।

मैं तो बयान CREATE ASSEMBLY [System.Data.DataSetExtensions] FROM 'C:\temp\System.Data.DataSetExtensions.dll' WITH PERMISSION_SET = UNSAFE; साथ विधानसभा स्थापित करने के लिए कर रहा था। चेतावनी:: माइक्रोसॉफ्ट .NET फ्रेमवर्क विधानसभा 'system.data.datasetextensions, संस्करण = 3.5.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089, processorarchitecture = MSIL

आप जब बयान पूरा करता है इस मैत्रीपूर्ण अनुस्मारक प्राप्त होगा। ' आप पंजीकरण कर रहे हैं SQL सर्वर होस्टेड वातावरण में पूरी तरह से परीक्षण नहीं किया गया है और समर्थित नहीं है। भविष्य में, यदि आप इस असेंबली या .NET Framework को अपग्रेड या सेवा करते हैं, तो आपका सीएलआर एकीकरण दिनचर्या काम करना बंद कर सकता है। अधिक जानकारी के लिए कृपया SQL सर्वर पुस्तकें ऑनलाइन देखें।

इस बिंदु पर, मैं तो System.Data.DataSetExtensions संदर्भ के लिए मेरी SQL CLR परियोजना में सक्षम था, और मैं पुष्टि की है कि AsEnumerable() DataTable उदाहरण पर दिखाया।

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