2009-08-06 10 views
6

यह प्रश्न question से चलता है, मैंने कल पूछा कि मेरी संस्थाओं पर शामिल क्वेरी का उपयोग क्यों करें, जो जटिल रूप से जटिल SQL उत्पन्न करता है। ऐसा लग रहा था कि इस तरह की एक पूछताछ:लिंक में शामिल होने और "ओल्ड स्टाइल" प्री एएनएसआई सिंटैक्स में शामिल होने के बीच क्या अंतर है?

 var query = from ev in genesisContext.Events 
        join pe in genesisContext.People_Event_Link 
        on ev equals pe.Event 
        where pe.P_ID == key 
        select ev; 

भयानक एसक्यूएल कि डेटाबेस पर चलाने के लिए 18 सेकंड लगे उत्पादित, (एक तरह से पूर्व एएनएसआई SQL सिंटैक्स) की तरह एक जहां खंड के माध्यम से संस्थाओं में शामिल होने जबकि कम ले लिया चलाने के लिए और एक ही परिणाम

 var query = from pe in genesisContext.People_Event_Link 
        from ev in genesisContext.Events 
        where pe.P_ID == key && pe.Event == ev 
        select ev; 

मैं सब कुछ खत्म हो googled है, लेकिन अभी भी समझ में नहीं आता क्यों दूसरा पहले करने के लिए विभिन्न एसक्यूएल का उत्पादन होता है का उत्पादन करने के लिए एक दूसरे से। क्या कोई मुझे अंतर बता सकता है? मैं कीवर्ड में शामिल होने का उपयोग करना चाहिए जब


यह एसक्यूएल कि उत्पादन किया गया था जब मैं इस्तेमाल किया अपनी क्वेरी में शामिल हों और चलाने के लिए 18 सेकंड लगे है:

SELECT 
1 AS [C1], 
[Extent1].[E_ID] AS [E_ID], 
[Extent1].[E_START_DATE] AS [E_START_DATE], 
[Extent1].[E_END_DATE] AS [E_END_DATE], 
[Extent1].[E_COMMENTS] AS [E_COMMENTS], 
[Extent1].[E_DATE_ADDED] AS [E_DATE_ADDED], 
[Extent1].[E_RECORDED_BY] AS [E_RECORDED_BY], 
[Extent1].[E_DATE_UPDATED] AS [E_DATE_UPDATED], 
[Extent1].[E_UPDATED_BY] AS [E_UPDATED_BY], 
[Extent1].[ET_ID] AS [ET_ID], 
[Extent1].[L_ID] AS [L_ID] 
FROM [dbo].[Events] AS [Extent1] 
INNER JOIN [dbo].[People_Event_Link] AS [Extent2] ON EXISTS (SELECT 
    1 AS [C1] 
    FROM (SELECT 1 AS X) AS [SingleRowTable1] 
    LEFT OUTER JOIN (SELECT 
      [Extent3].[E_ID] AS [E_ID] 
     FROM [dbo].[Events] AS [Extent3] 
     WHERE [Extent2].[E_ID] = [Extent3].[E_ID]) AS [Project1] ON 1 = 1 
    LEFT OUTER JOIN (SELECT 
     [Extent4].[E_ID] AS [E_ID] 
     FROM [dbo].[Events] AS [Extent4] 
     WHERE [Extent2].[E_ID] = [Extent4].[E_ID]) AS [Project2] ON 1 = 1 
    WHERE ([Extent1].[E_ID] = [Project1].[E_ID]) OR (([Extent1].[E_ID] IS NULL) AND ([Project2].[E_ID] IS NULL)) 
) 
WHERE [Extent2].[P_ID] = 291 

यह एसक्यूएल है कि एएनएसआई स्टाइल सिंटैक्स का उपयोग करके उत्पादन किया गया था (और यदि मैं खुद एसक्यूएल लिख रहा था तो मैं काफी लिखूंगा):

SELECT * FROM Events AS E INNER JOIN People_Event_Link AS PE ON E.E_ID=PE.E_ID INNER JOIN PEOPLE AS P ON P.P_ID=PE.P_ID 
WHERE P.P_ID = 291 
+0

शानदार सवाल। – tomfanning

+0

आप किस डीबी का उपयोग कर रहे हैं? एसक्यूएल कोड कैसा दिखता है? – AnthonyWJones

उत्तर

4

उपर्युक्त प्रश्नों में से कोई भी पूरी तरह से "सही" नहीं है। ईएफ में, उपर्युक्त में से किसी एक के संबंध में संबंध गुणों का उपयोग करना आम तौर पर सही होता है। उदाहरण के लिए, यदि आप PHONENUMBERS के लिए कई रिश्ते एक संपत्ति बुलाया Person.PhoneNumbers में करने के लिए एक से एक के साथ एक व्यक्ति वस्तु था, तो आप लिख सकते हैं:

var q = from p in Context.Person 
     from pn in p.PhoneNumbers 
     select pn; 

एफई आप के लिए शामिल होने का निर्माण होगा।

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

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

+0

अंत में यह काम कर रहा है और थोड़ा बेहतर समझ रहा है जो मैं करने की कोशिश कर रहा हूं - धन्यवाद। – Calanus

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