2014-04-09 6 views
7

मुझे इसे समझने की आवश्यकता है। इस मेरी LINQ है मेरी कोड में TSQL कोड पीढ़ीEntityFramework LINQToEntities अजीब धीमी टीएसक्यूएल उत्पन्न करता है जहां क्लॉज

में EF5.0 और EF6 बीच एक बड़ा अंतर है * -। Statemant

var qry2 = context.viw_overview_1.Where(i => i.article_EAN17 == ean).Select(i => i.article_id).Take(200); 

EntityFramework 5.0 सिर्फ एक सरल और तेजी से TSQL उत्पन्न कहां - इस तरह बयान है, जो एकदम सही है

... WHERE [Extent1].[article_EAN17] = @p__linq__0 
00.0960096ms in SSMS 

लेकिन EntityFramework 6. * एक बहुत जटिल और धीमी गति से बयान उत्पन्न

... WHERE (([Extent1].[article_EAN17] = @p__linq__0) AND (NOT ([Extent1].[article_EAN17] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent1].[article_EAN17] IS NULL) AND (@p__linq__0 IS NULL)) 
45.3665362ms in SSMS 

फ़ील्ड आलेख_एएनए 17 में एक सूचकांक भी है। हालांकि EF6। * प्रारंभ करने के लिए वैसे भी उम्र लेता है, लेकिन EF6 में एक साधारण WHERE कथन उत्पन्न करने के लिए का कोई तरीका है। * गुणों या इस तरह के कुछ के साथ? मैंने स्ट्रिंग की कोशिश की। एक्वाल्स(), स्ट्रिंग। कॉम्पैयर(), पैरामीटर स्वैपिंग, लेकिन कुछ भी नहीं बदला।

Why does Entity Framework 6 generate complex SQL queries for simple lookups? अंतर की व्याख्या करें, लेकिन सरल टीएसक्यूएल उत्पन्न करने वाले ईएफ को मजबूर करने का कोई तरीका है।

+1

मुझे संदेह है कि टी-एसक्यूएल परिवर्तन चीजों को धीमा कर रहा है। क्या आपने एक ही डेटासेट पर दोनों प्रश्नों का प्रयास किया था? – haim770

+1

बस उत्सुक - क्या आपने एसएसएमएस में दो बयानों को थप्पड़ मार दिया है और उनके प्रदर्शन की तुलना की है? –

+0

ईएफ 5 की सरल तुलना सी # में ईएफ 6 की तुलना में 5 गुना तेज है और एसएसएमएस – Roland

उत्तर

8

मुझे इस पर विश्वास इकाई की रूपरेखा में अपने शून्य तुलना सेटिंग से संबंधित है

को देखने के लिए आपकी क्वेरी से पहले निम्न कोड जोड़ यदि यह आपकी खोज प्रदर्शन में मदद करता है:

context.ContextOptions.UseCSharpNullComparisonBehavior = true; 
+1

क्या यह डिफ़ॉल्ट रूप से गलत नहीं है? http://msdn.microsoft.com/en-us/library/system.data.entity.core.objects.objectcontextoptions.usecsharpnullcomparisonbehavior(v=vs.113).aspx – IronMan84

+3

वास्तविक यह 'संदर्भ है। कॉन्फ़िगरेशन।UseDatabaseNullSemantics = true; 'thx को मैटसी – Roland

+0

बस उत्तर अपडेट किया गया। टाइपो के लिए खेद है। – mmilleruva

1

आप पूरी तरह, सकारात्मक की जरूरत है उस नल चेक को कटा हुआ बंद करने के लिए, आप हमेशा क्वेरी (और सभी पैरामीटर) को मैन्युअल रूप से कॉन्फ़िगर करने के लिए DbSet.SqlQuery() (प्रलेखन here) का उपयोग कर सकते हैं। सावधान रहें, हालांकि, क्योंकि कभी-कभी वह तरीका उन तरीकों से काम कर सकता है जिनकी आप उम्मीद नहीं कर रहे हैं। यदि आप किसी ट्रैकिंग को नहीं चाहते/चाहते हैं तो आप (प्रलेखन here) का उपयोग भी कर सकते हैं, जो आपको अपनी क्वेरी के साथ जेनेरिक का उपयोग करने की अनुमति देगा (अन्यथा आपको इसे कास्ट करना होगा)।

मैं व्यक्तिगत रूप से इसे अकेले छोड़ दूंगा, या टिप्पणियों में उल्लिखित @EricScherrer जैसे संग्रहीत प्रक्रियाओं का उपयोग करूंगा।

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