सवाल LINQ जेनरेटेड एसक्यूएल कथन कैसे देखें?


ऑब्जेक्टक्वायर विधि का उपयोग करके यह कैसे किया जाता है?


44
2018-02-04 15:53


मूल




जवाब:


आप हमेशा अपने डेटाकॉन्टेक्स्ट की .og संपत्ति में कुछ संलग्न कर सकते हैं। वह सभी SQL आदेशों को भेजे जाने के रूप में दिखाएगा।

मैं इसे डेटा एक्सेस ऑब्जेक्ट्स के लिए अपने बेस में करता हूं और इसे विजुअल स्टूडियो डीबग कंसोल पर आउटपुट करता हूं। जैसे-जैसे ऑब्जेक्ट्स उनके डेटाकॉन्टेक्स्ट को बनाते हैं, मैं इसे देखता हूं कि यह डीबग है और इस तरह एक टेक्स्टवाइटर सहायक वर्ग संलग्न करता है:

dbDataContext _dB = new dbDataContext();
_dB.CommandTimeout = 5000;

#if DEBUG
    _dB.Log = new DebugTextWriter();
#endif

डीबग कंसोल के आउटपुट के लिए सहायक ऑब्जेक्ट यहां दिया गया है:

//utility class for output of TextWriter for the Visual Sudio Debug window
class DebugTextWriter : System.IO.TextWriter
{
    public override void Write(char[] buffer, int index, int count)
    {
        System.Diagnostics.Debug.Write(new String(buffer, index, count));
    }

    public override void Write(string value)
    {
        System.Diagnostics.Debug.Write(value);
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.Default; }
    }
}

52
2018-02-04 16:28



उपयोग करने वालों के लिए इकाई फ्रेमवर्क 6 चेक इसउम्मीद है कि किसी की मदद करें। - stom


ऑब्जेक्टक्वायर विधि का उपयोग करके मुझे यह मिला है। परीक्षण के लिए कंसोल का उपयोग करके, आप निम्न कार्य कर सकते हैं:

नीचे एक एक्सटेंशन विधि बनाएं, फिर इसे कॉल करें। उत्पाद उत्पाद कहें, फिर SQL उत्पाद के रूप में प्रिंट करता है। ToTraceString।

public static class MyExtensions
{
    public static string ToTraceString<T>(this IQueryable<T> t)
    {
        string sql = "";
        ObjectQuery<T> oqt = t as ObjectQuery<T>;
        if (oqt != null)
            sql = oqt.ToTraceString();
        return sql;
    }
}

23
2018-02-04 16:39



इसका उपयोग वीएस वॉच विंडो में भी किया जा सकता है: ((ObjectQuery)myQuery).ToTraceString()। अच्छा है! - icebat
कुल विधियों के बारे में क्या Count? - Mat J
मुझे लगता है कि dbContext का उपयोग करते समय काम नहीं करता है क्योंकि आप इस मामले में IQueryable <T> ObjectQuery <T> नहीं डाल सकते हैं। - NER1808


आप उपयोग कर सकते हैं LINQPad उसके लिए।


18
2018-02-04 15:56



वे ऑब्जेक्टक्वायर विधि या एसक्यूएल प्रोफाइलर का उपयोग करते हुए कहते हैं। उदाहरण के लिए कंसोल में प्रोग्रामेटिक रूप से यह कैसे करें? - nellbryant
मुझे यकीन नहीं है कि क्या मैं अंतिम प्रश्न समझ गया हूं ... कम से कम, अपने शीर्षक में प्रश्न का उत्तर देने के लिए, "LINQ जेनरेटेड एसक्यूएल कथन कैसे देखें": LINQPad में एक आउटपुट विंडो है जहां आप या तो "परिणाम" चुन सकते हैं, " लैम्ब्डा "या" एसक्यूएल "। - Olav Haugen
हे, यह एक अच्छा ओपन सोर्स टूल है! धन्यवाद। - nellbryant
LinqPad reccomendation के लिए +1। यह आवश्यक उपकरण की हर .NET डेवलपर की सूची पर होना चाहिए। - Doctor Jones
जब मैं इस प्रश्न का उत्तर खोजता था तो मैं पहले से ही लिंकपैड का उपयोग कर रहा था। मैंने परिणाम फलक में 'एसक्यूएल' बटन को पूरी तरह याद किया था। धन्यवाद - Greg Woods


 var q = from img in context.Images
                    ...
         select img;
 string sql = q.ToString();

sql एसक्यूएल चयन क्वेरी होगी।

संपादित करें: नुकसान: पैरामीटर इस समय कोई मूल्य नहीं होगा


16
2017-12-23 14:39



यदि आप स्थानीय रूप से डीबग कर रहे हैं और SQL सर्वर का उपयोग कर रहे हैं, तो SQL प्रोफाइलर चलाएं। सभी पैरामीटर के साथ क्वेरी वहां दिखाई देगी। - Rich


आप देख सकते थे लिंक-टू-एसक्यूएल डीबग विजुअलाइज़र, या बस अपने माउस को अपने लिंक-टू-एसक्यूएल क्वेरी पर घुमाएं (टूलटिप जेनरेट एसक्यूएल दिखाना चाहिए), या एक्सेस:

context.GetCommand(query).CommandText

14
2018-02-04 16:16



मैंने अभी तक GetCommand कोशिश नहीं की है। मुझे स्कॉट गु से लिंक पसंद है! क्या विज़ुअलाइज़र विजुअल स्टूडियो 2010 में अंतर्निहित है? - nellbryant
@nellbryant: नहीं, यह अभी भी एक अलग एक्सटेंशन है जिसे आपको वीएस गैलरी से पकड़ने की आवश्यकता है - marc_s


आप SQL सर्वर प्रोफाइलर चला सकते हैं।


5
2018-05-31 15:57





डेटाबेस संदर्भ सेट अप करते समय मैं यही उपयोग करता हूं:

this.DbContext.Database.Log += s => Debug.WriteLine(s);

1
2018-06-28 22:08





बस एक छोटा सा अपडेट अब आप SQL को लॉग इन करने के लिए एक क्रिया का उपयोग कर सकते हैं:

// test SQL logger
Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message);
_dB.Context().Database.Log = SQLLogger;

0
2017-09-20 10:04