2013-07-19 4 views
8

मैं एक तालिका स्तंभ के साथ PersonTable कहा जाता है: PersonId, RestarauntId, Ageदृश्य से चयन करते समय इकाई ढांचा एक सबक्वायरी क्यों बनाता है?

मैं एक दृश्य PersonView कहा जाता है कि करता है:

select PersonId, 
     RestarauntId, 
     RestarauntName(RestarauntId) as `RestarauntName`, 
     Age 
FROM PersonTable 

जब मैं के रूप में सरल कुछ करना:

var persons = context.PersonView.Where(x=>x.PersonId == 1) 
           .Select(x=> 
            new {x.PersonId, 
             x.RestarauntId, 
             x.RestarauntName, 
             x.Age }); 

ऊपर 1 रिकॉर्ड देता है और मैं माइस्क्ल क्वेरी होने की अपेक्षा करता हूं:

SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView 
WHERE PersonId = 1 

लेकिन इसके बजाय, यह उत्पन्न करता है निम्नलिखित:

SELECT 1 AS `C1`, T.PersonId, T.RestarauntId, T.RestarauntName, T.Age 
FROM 
(SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView) AS T 
WHERE T.PersonId = 1 

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

+0

पर जाएं MySQL एक ही योजना के लिए दोनों प्रश्नों को अनुकूलित करने में सक्षम नहीं है? शायद अंतर रनटाइम पर कोई फर्क नहीं पड़ता। – usr

+2

http://stackoverflow.com/questions/12690775/why-ef-generating-a-sub-query-for-a-simle-query –

+1

मुझे नहीं पता कि यह मदद करता है, लेकिन ईएफ महत्वपूर्ण जानकारी का उपयोग नहीं करेगा या तो शामिल प्रकारों को निर्धारित करने के लिए विचारों पर। यह केवल टेबल पर एक आंतरिक जुड़ने का उपयोग करता है, विचारों पर कभी नहीं। – Brannon

उत्तर

1

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

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