LINQ

2013-10-05 4 views
7

द्वारा सरल आदेश के लिए उप क्वेरी उत्पन्न करना मुझे समझ में आ रहा है कि SQL आउटपुट में LINQ में लिखी गई एक साधारण क्वेरी के लिए उप-क्वेरी क्यों है। यह मेरा कोड है:LINQ

var list = db.User.Where(u => u.Name == somename).OrderBy(u => u.IdUser).ToList(); 

जहां SomeName एक पैरामीटर मैं निष्पादन समय पर गुजर कर रहा हूँ है।

उत्पादन एसक्यूएल है:

SELECT 
Project1.IdUser, 
Project1.Name 
FROM (SELECT 
Extent1.IdUser, 
Extent1.Name 
FROM user AS Extent1 
WHERE Extent1.Name = 'John' /* @p__linq__0 */) AS Project1 
ORDER BY 
Project1.IdUser ASC 

उत्पादन वास्तव में कुछ है कि सरल के लिए एक उप क्वेरी होने पर?

मैं भी

var list = db.User.Where(u => u.Name.Equals(somename)).OrderBy(u => u.IdUser).ToList(); 

जो उपर दिए गए उत्पादन उत्पन्न करने की कोशिश की।

मैं मुश्किल कोड पैरामीटर, जैसे हैं:

var list = db.User.Where(u => u.Name == "John").OrderBy(u => u.IdUser).ToList(); 

यह उम्मीद काम करता है के रूप में, केवल

SELECT 
Extent1.IdUser, 
Extent1.Name 
FROM user AS Extent1 
WHERE 'John' /* @gp1 */ = Extent1.Name 
ORDER BY 
Extent1.IdUser ASC 

कुछ बातें मैं उपयोग कर रहा हूँ पैदा:

  • EntityFramework 5 , .NET 4.5
  • SQL सर्वर 2012
  • झलक (जो MiniProfiler उपयोग करता है) एसक्यूएल को देखने के लिए उत्पन्न

मैं एक LINQ विशेषज्ञ नहीं हूँ, तो क्या मैं यहाँ याद आ रही है?

+2

क्या दोनों के बीच क्वेरी योजना में कोई अंतर है? – Laurence

+0

नहीं, वे एक ही निष्पादन योजना को हल करते हैं, लेकिन यह वाक्यविन्यास मुझे खराब करता है। कल्पना करें कि क्या मैं LINQ द्वारा उत्पन्न सभी जटिल अनावश्यक जटिलता के साथ एक और जटिल क्वेरी डीबग कर रहा हूं, यह उत्पादक नहीं होगा। –

+0

एब्स्ट्रक्शन एक लागत के साथ आता है। यदि आपको लागत पसंद नहीं है, तो स्वयं को एसक्यूएल लिखें। इन विकल्पों में से कोई सही या गलत पक्ष नहीं है। – Laurence

उत्तर

2

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

मैं यह नहीं कह रहा हूं कि आपको प्रदर्शन कारणों के लिए एसक्यूएल नहीं देखना चाहिए (या उस क्वेरी की निष्पादन योजना कहने के लिए बेहतर)। लेकिन के बाद आपको प्रदर्शन समस्याओं की पहचान की जानी चाहिए। और आपको प्रश्न सरल लिखने का प्रयास करना चाहिए, यह सफलता का मार्ग है। बेशक यदि आप एसक्यूएल जानते हैं तो आप जानते हैं कि सेट की यह दुनिया ऑब्जेक्ट की दुनिया से अलग है - आप LINQ (ऑब्जेक्ट्स वर्ल्ड के लिए धन्यवाद) में आसानी से काफी औसत क्वेरी लिख सकते हैं, लेकिन यह खराब एसक्यूएल (सेट्स वर्ल्ड) के रूप में समाप्त हो जाएगा क्योंकि " दुनिया के बीच मेल नहीं "।

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