2013-03-21 15 views
12

का उपयोग करते समय ईएफ में बड़े जेनरेट किए गए SQL क्वेरी से कैसे बचूं, मैं डेटाबेस के विरुद्ध क्वेरी करने के लिए ईएफ (डीएलएल संस्करण 4.4) का उपयोग कर रहा हूं। डेटाबेस में पाठ्यक्रम की जानकारी के साथ कई टेबल शामिल हैं। जब वास्तव में डीबी को भेजा जाता है तो मुझे एक विशाल, लगभग 1300 लाइन एसक्यूएल क्वेरी दिखाई देती है (जिसे मैं इसके आकार के कारण यहां पेस्ट नहीं कर रहा हूं)। क्वेरी मैं संदर्भ पर चल रहा हूँ लगता है:मैं()

entities.Plans 
    .Include("program") 
    .Include("program.offers") 
    .Include("program.fees") 
    .Include("program.intakes") 
    .Include("program.requirements") 
    .Include("program.codes") 
    .Include("focuses") 
    .Include("codes") 
    .Include("exceptions") 
    .Include("requirements") 
where plans.Code == planCode 
select plans).SingleOrDefault(); 

मैं जब संबंधित तालिकाओं में से प्रत्येक से जानकारी एकत्रित कर सर्वर से वापस जाने के लिए होने से बचने के लिए चाहते हैं, लेकिन इतनी बड़ी क्वेरी के साथ मैं अगर सोच रहा हूँ ऐसा करने का एक बेहतर तरीका है?

धन्यवाद।

+0

ठीक है आप उत्सुक लोडिंग कर रहे हैं और आपकी क्वेरी एक ही समय में सभी डेटा प्राप्त करने का प्रयास कर रही है, इस प्रकार यह बड़ा क्यों है। आप वास्तव में एक समस्या के रूप में क्या देखते हैं?अन्य विकल्प आभासी गुणों के साथ आलसी लोडिंग करना है, जिसे आप उन्हें एक्सेस करने का प्रयास करते समय पृष्ठभूमि में ईएफ द्वारा लाए जाएंगे, लेकिन आपने निर्दिष्ट किया है कि आप डेटाबेस पर राउंडट्रिप्स नहीं चाहते हैं। –

+0

यहां एक समान उत्तर है http://stackoverflow.com/questions/5521749/how-many-include-i-can-use-on-objectset-in-entityframework-to-retain-performance –

+0

मुझे लगता है कि मैं था सोच रहा हूं कि क्या मैं इसे सही तरीके से देख रहा हूं। एक बड़ी क्वेरी बनाम कई छोटे प्रश्न या क्या ऐसा करने का एक बेहतर तरीका है। – b3n

उत्तर

0

आप जहां खंड के बाद आमतौर पर .Include() जोड़ सकते हैं। इसका मतलब यह है कि आप केवल उस जानकारी को खींच रहे हैं जो आप चाहते हैं उससे मेल खाता है, देखें कि इससे आपकी क्वेरी कम हो जाती है या नहीं।

+1

इससे कोई फर्क नहीं पड़ता। मैंने LINQPad में क्वेरी चलाई और एसक्यूएल उत्पन्न दोनों मामलों में समान है। – b3n

+0

'कहां है' के बाद और यह अभी भी वही था? अजीब लगता है ... केवल एक और चीज जो मैं सुझा सकता हूं वह है नेविगेशन गुणों को आजमाने के लिए, मेरा मानना ​​है कि वे थोड़ा अलग काम करते हैं, लेकिन मैं ईमानदारी से उन्हें पूरी तरह समझ नहीं पा रहा हूं। वैकल्पिक रूप से, आप फ़िल्टर/जहां खंड के साथ योजना तालिका से जानकारी निकाल सकते हैं। फिर आपको जो चाहिए उसे प्राप्त करने के लिए कुछ शामिल बयान चलाएं। संहिता काफी संक्षिप्त नहीं है, लेकिन इसे चीजों को गति देना चाहिए। – Trent

0

जैसा कि आप उत्सुक लोडिंग कर रहे हैं, इसलिए यदि आप आवश्यक संस्थाओं का चयन कर रहे हैं तो यह ठीक है। अन्यथा आप आलसी लोडिंग के साथ जा सकते हैं, लेकिन जैसा कि आपने निर्दिष्ट किया है कि आप डेटाबेस राउंड ट्रिप नहीं चाहते हैं, इसलिए आप इससे बच सकते हैं।

मैं सुझाव दूंगा, यदि यह क्वेरी कई बार उपयोग की जाती है तो आप संकलित क्वेरी का उपयोग कर सकते हैं। ताकि यह प्रदर्शन में वृद्धि होगी।

इस लिंक के माध्यम से जाओ, अगर आप चाहते हैं .. http://msdn.microsoft.com/en-us/library/bb896297.aspx

0

आप DbContext का उपयोग कर रहे हैं, तो आप .Local संपत्ति संदर्भ पर अगर आपके इकाई पहले से लिया गया है और इसलिए संदर्भ से जुड़ा हुआ है देखने के लिए उपयोग कर सकते हैं ।

तो क्वेरी से पहले समाप्त हो चुकी थी और अपने जड़ Plan संस्थाओं को पहले से ही Plan.Code == planId, शायद इसके उप-संस्थाओं को भी पहले से ही जुड़े होते हैं, क्योंकि आप उत्सुक लोड हो रहा है था, इसलिए नेविगेशन गुण मारा नहीं होगा के माध्यम से उन्हें की चर्चा करते हुए के आधार पर जुड़े होते हैं उस संदर्भ के जीवनकाल के दौरान फिर से उनके लिए डीबी।

यह article.Local का उपयोग करने में सहायक हो सकता है।

0

आप प्रक्षेपण Include का उपयोग कर के बजाय अपने संदर्भित संस्थाओं वापस खींचने के लिए द्वारा एक थोड़ा अधिक संक्षिप्त SQL क्वेरी प्राप्त करने में सक्षम हो सकता है: यदि आप अपने संदर्भ इस प्रकार के आलसी लोड हो रहा है अक्षम करते हैं

var planAggregate = 
(from plan in entities.Plans 
    let program = plan.Program 
    let offers = program.Offers 
    let fees = program.Fees 
    //... 
    where plan.Code == planCode 
    select new { 
    plan 
    program, 
    offers, 
    fees, 
    //... 
    }) 
    .SingleOrDefault(); 

क्वेरी के परिणामस्वरूप आपकी संस्थाओं के नेविगेशन गुणों को आपकी क्वेरी में शामिल इकाइयों के साथ पॉप्युलेट किया जा रहा है।

(मैंने केवल EF.dll v5.0 पर इसका परीक्षण किया है, लेकिन इसे EF.dll v4.4 पर व्यवहार करना चाहिए, जो कि .NET 4.0 पर केवल EF5 है। जब मैंने इस पैटर्न का उपयोग करके परीक्षण किया Include इसी तरह के आकार की क्वेरी पर यह एसक्यूएल की 500 लाइनों में से लगभग 70 लाइनों को काटता है। आपका माइलेज भिन्न हो सकता है।)

1

थोड़ा देर हो चुकी है, लेकिन आपका डेटा केवल दिन में एक बार बदल रहा है, आपको जो कुछ भी चाहिए एक अनुक्रमित दृश्य और इस दृश्य को अपने ईएफ मॉडल में रखें।