जबकि Entity Framework performance पर एक लेख पढ़ रहा है, मैं जानकारी के इस टुकड़े भर में आया था:एक LINQ अभिव्यक्ति क्वेरी नए सिरे से लिखना कैशिंग एसक्यूएल निष्पादन योजना को सक्षम करने के
दूसरे, समस्या [एसक्यूएल सर्वर कार्य योजना लागू करके पुन: उपयोग नहीं होगा ] पहली जगह में होता है क्योंकि (छोड़ने के लिए) (int) के लिए एक int गुजरते समय (कार्यान्वयन विस्तार के कारण), इकाई फ्रेमवर्क यह नहीं देख सकता कि क्या वे पूर्ण मूल्यों को लेते हैं जैसे कि टेक (100), या चर (परिणामPerPage) जैसे परिवर्तनीय, इसलिए यह नहीं पता कि मान पैरामीटरकृत किया जाना चाहिए या नहीं।
var schools = db.Schools .OrderBy(s => s.PostalZipCode) .Skip(model.Page * model.ResultsPerPage) .Take(model.ResultsPerPage) .ToList();
इस शैली करने के लिए:
प्रस्तावित समाधान कोड के इस शैली बदलने के लिए है
int resultsToSkip = model.Page * model.ResultsPerPage;
var schools = db.Schools
.OrderBy(s => s.PostalZipCode)
.Skip(() => resultsToSkip) //must pre-calculate this value
.Take(() => model.ResultsPerPage)
.ToList();
कौन सा इकाई की रूपरेखा पता चला है कि इन चरों कर रहे हैं और कि उत्पन्न की अनुमति देता है एसक्यूएल को parametrized किया जाना चाहिए, जो बदले में निष्पादन योजना का पुन: उपयोग करने की अनुमति देता है।
हमारे पास हमारे एप्लिकेशन में कुछ कोड है जो वैरिएबल का उपयोग उसी तरह करता है, लेकिन हमें रनटाइम पर अभिव्यक्ति बनाना होगा क्योंकि प्रकार पहले से ज्ञात नहीं है।
var convertedId = typeof(T).GetConvertedIdValue(id);
var prop = GetIdProperty(typeof(T));
var itemParameter = Expression.Parameter(typeof(T), "item");
var whereExpression = Expression.Lambda<Func<T, bool>>
(
Expression.Equal(
Expression.Property(
itemParameter,
prop.Name
),
Expression.Constant(convertedId)
),
new[] { itemParameter }
);
return Get<T>().Where(whereExpression);
समस्या यह है कि Expression.Constant(convertedId)
का उपयोग कर एक निरंतर उत्पन्न एसक्यूएल करने के लिए सम्मिलित करने के लिए कारण बनता है:
यहाँ क्या यह की तरह लग रहे करने के लिए प्रयोग किया जाता है।
WHERE [Extent1].[Id] = 1234
और:
WHERE [Extent1].[Id] = 1235
और: यह एसक्यूएल हर नया आइटम जिसे आप खोजना है, जो किसी भी कार्य योजना लागू करके कैशिंग बंद हो जाता है के लिए बदलने के लिए कारण बनता है
WHERE [Extent1].[Id] = 1236
सवाल तो, जेनरेट एसक्यूएल के पैरामीट्रिजेशन को मजबूर करने के लिए आप इस तरह अभिव्यक्ति भवन का उपयोग कैसे कर सकते हैं?() => convertedId
वाक्यविन्यास काम नहीं करेगा। मैंने इसका उत्तर दिया है।
मुझे यह नहीं मिला, यहां सवाल क्या है? –
प्रश्न था कि Expression.Constant का उपयोग करते समय पैरामीट्रिज्ड एसक्यूएल उत्पन्न करने के लिए ऊपर दिए गए कोड को कैसे परिवर्तित किया जाए, क्योंकि '() => convertId' वाक्यविन्यास काम नहीं करता है। –
मैंने मुख्य पोस्ट को स्पष्ट रूप से प्रश्न शामिल करने के लिए अपडेट किया है। –