2011-11-17 5 views
21

मैं अपने प्रोजेक्ट में LINQ का उपयोग कर रहा करने के लिए LINQ में इस्तेमाल नहीं किया जा सकता और मेरे कोड है:स्थानीय अनुक्रम() क्वेरी ऑपरेटरों की एसक्यूएल कार्यान्वयन को छोड़कर शामिल ऑपरेटर

var SE = from c in Shop.Sections 
        join c1 in obj.SectionObjects on c.SectionId equals c1.SectionId 
        select c; 

dataGridView1.DataSource = SE; 

लेकिन मैं लाइन dataGridView1.DataSource = SE;
में इस त्रुटि का सामना त्रुटि संदेश है:

स्थानीय अनुक्रम शामिल हैं() ऑपरेटर को छोड़कर क्वेरी ऑपरेटरों की एसक्यूएल कार्यान्वयन के लिए LINQ में उपयोग नहीं किया जा सकता है।

+0

होवर आते हैं और हमें अपनी तरह बताना होगा। फिर obj.SectionObjects पर होवर करें और हमें इसके प्रकार बताएं। – mjwills

उत्तर

31

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

var SE = Shop.Sections.Where(s => obj.SectionObjects 
             .Select(so => so.SectionId) 
             .Contains(s.SectionId)) 
         .ToList(); 

select * from Sections where sectionId in (...) 

जहां खंड में के लिए मूल्यों स्थानीय वस्तुओं के संग्रह में id की सूची से आने के लिए अनुवाद करता है।

+3

यह बिल्कुल सही नहीं है। यदि कोई स्थानीय स्रोत पहले जाता है तो इसमें शामिल होना संभव है। नीचे जवाब देखें। – ChelowekKot

10

यह काम करना चाहिए और डेटाबेस की ओर (IN का उपयोग) पर किया जाना है, न कि स्मृति की तुलना में:

var SE = from c in Shop.Sections 
     where obj.SectionObjects.Select(z => z.SectionId).Contains(c.SectionId) 
     select c; 

L2S Profiler चीजों के इन प्रकार के लिए बहुत उपयोगी है - आप विभिन्न एसक्यूएल द्वारा उत्पन्न की जा रही तुलना कर सकते हैं मेरा समाधान और अन्य समाधान।

+0

यह कोड अमान्य में है, त्रुटि है: त्रुटि 'System.Data.Linq.EntitySet के लिए सबसे अच्छा ओवरलोडेड विधि मिलान। कंटेनर (Shop.SectionObject)' में कुछ अमान्य तर्क हैं – Mehrdad

+0

मेरे कोड में निश्चित टाइपो , अभी पुनः प्रयास करें। – mjwills

+1

@mjwills, "एल 2 एस प्रोफाइलर" लिंक मर चुका है। Http://www.linqpad.net/ के बारे में कैसे? – RoastBeast

-5

वर एसई = से ग c.SectionId पर Shop.Sections.AsEnumerable() ToList() obj.SectionObjects.AsEnumerable() में c1 में शामिल होने ToList() में बराबर होती है c1.SectionId ग का चयन करें।।

डेटाग्रिड व्यू 1। डेटासोर्स = एसई;

17

आप स्थानीय स्रोत में SQL स्रोत, पर शामिल नहीं हो सकते हैं लेकिन आप स्थानीय स्रोत में SQL स्रोत में शामिल हो सकते हैं, v.v.

var SE = from c1 in obj.SectionObjects 
       join c in Shop.Sections on c1.SectionId equals c.SectionId 
       select c; 

दूसरे शब्दों में, स्थानीय स्रोत Shop.Sections पहले ओवर

+4

यह स्वीकार्य उत्तर होना चाहिए। इस दृष्टिकोण में, (जब तक कि मैं गहराई से गलत नहीं हूं), एसक्यूएल स्रोत की गणना नहीं की जाएगी (इसलिए कुछ डीबी ओवरहेड से परहेज) –

+1

यह समाधान काम करता है अगर डीबी तालिका अपेक्षाकृत छोटी है। हालांकि, यह तुलना करने के लिए पूरी तालिका को डीबी से मेमोरी (एसक्यूएल ट्रेस के साथ सत्यापित) की गणना करता है।हमारे पास एक जटिल बहु-तालिका "स्थानीय स्रोत के लिए SQL स्रोत" परिदृश्य था और परिणामस्वरूप स्मृति अपवाद त्रुटि से बाहर निकलना शुरू कर दिया। उपयोग करने वाले अन्य उत्तरों क्वेरी को "IN" का उपयोग करके SQL सर्वर पर चलाने की अनुमति देता है और केवल संबंधित रिकॉर्ड खींचता है। उन उत्तरों को स्वीकार्य उत्तर होना चाहिए, खासकर बड़ी टेबल के लिए। – SpokaneDJ

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