2015-03-10 4 views
7

मुझे कुछ धीमे चलने वाले प्रश्नों के साथ समस्या है जो हम केवल उत्पादन में देखते हैं, और मैं प्रोफाइलर में खराब प्रदर्शन करने वाले एसक्यूएल देख सकता हूं, हालांकि, मुझे नहीं पता कि मैं इस कोड का उपयोग उस कोड पर वापस खोजने के लिए कैसे कर सकता हूं जिसने कथन उत्पन्न किया था, या यदि ईएफ क्वेरी पर वापस ट्रेस करना संभव है तो भी संभव है। क्या ईएफ में कोड में समस्या का पता लगाने में मदद के लिए एसक्यूएल कथन की उत्पत्ति की पहचान करने की कोई क्षमता है?मैं ईएफ द्वारा उत्पन्न किए गए SQL क्वेरी को उस कोड पर वापस कैसे देख सकता हूं जिसने इसे बनाया

मेरा मानना ​​है कि इस मुद्दे pessimistically कोड लोड हो रहा है लोड हो रहा है से संबंधित हो सकती है, इसके लोड हो रहा है एक पूरे परिणाम सेट IE और उसके बाद नहीं बल्कि एसक्यूएल

+0

क्या आपने http://www.hibernatingrhinos.com/products/efprof को खरीदने पर विचार किया है। Http://ayende.com/blog/169155/nhibernate-entity-framework-profiler-3-0 –

+0

ईएफ का कौन सा संस्करण पढ़ें? – xanatos

+3

इकाई ढांचे के साथ 6 आपको [लॉग इन] करने में सक्षम होना चाहिए (https://msdn.microsoft.com/en-us/data/dn469464.aspx)। लेकिन एक आसान तरीका (जिसका मैं उपयोग करता हूं) केवल उन प्रश्नों के लिए ब्रेकपॉइंट्स डालता है जो सबसे संदिग्ध हैं। आपको पता होना चाहिए कि किस तालिका में मैप किया गया है, सही है? – Default

उत्तर

1

आप निम्न कर सकते में यह छानने से कोड में एक सूची को फ़िल्टर, प्रत्येक रेपॉजिटरी या डेटाकॉन्टेक्स्ट (सामान्य स्थान जहां क्वेरी निष्पादित हो रही है) में प्रत्येक क्वेरी लिखने के लिए डीबग करने के लिए।

var data= from item in entity 
       where item.id = 564564 
       select item;  
Debug.WriteLine(((System.Data.Objects.ObjectQuery)data).ToTraceString()); 

आप नीचे दिए गए कोड कॉल स्टैक है क्या जब क्वेरी ऊपर मार डाला गया था कहने के लिए लिख सकते हैं। फिर उस क्वेरी को ढूंढें जिसे आप ढूंढ रहे हैं और कॉल स्टैक आपको बताएगा कि क्वेरी कहां निष्पादित की गई थी।

StackTrace stackTrace = new StackTrace();   // get call stack 
StackFrame[] stackFrames = stackTrace.GetFrames(); 

आप इस सामान को लॉग इन करने के लिए माइक्रोसॉफ्ट ट्रेसिंग या लॉग 4नेट का उपयोग कर सकते हैं और फिर आसानी से अपनी क्वेरी ढूंढ सकते हैं।

+1

मुझे लगता है कि इसका मतलब है कि परिणामस्वरूप SQL क्वेरी को इसके मूल ईएफ/सी # कोड के लिए पहचाना जा सकता है। –

+0

अच्छी तरह से मैंने सोचा कि वह इन प्रश्नों का पता लगा सकता है, और उसके बाद प्रोफ़ाइल प्रश्नों के साथ मेल खाता है। मैं संपादित करूंगा .. –

0

आप अपने डेटाबेस में एक और इकाई बना सकते हैं (यानी: डीबगइन्टिटी) और वास्तविक प्रश्नों के ठीक पहले/उसके बाद एक क्वेरी चलाएं।

ctx.DebugEntity.Where(x => x.ID == "myId1"); //myId2, myId3, myId4, whatever helps you locate the LINQ query from the profiler... 

यह एसक्यूएल प्रोफाइलर में दिखाना चाहिए।

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

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