2013-04-18 10 views
6

इस परिदृश्य पर विचार करें।समानता द्वारा कैशिंग LINQ अभिव्यक्ति

आपके पास एक भंडार है जो कुछ कॉल करने की अनुमति देता है। ये कॉल LINQ का उपयोग करते हैं और लौटाए गए डेटा की मात्रा के संदर्भ में अपेक्षाकृत महंगे हो सकते हैं।

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

जिस चीज़ को मैं अपने सिर को लपेटने की कोशिश कर रहा हूं, वह कैश में कुंजी कैसे है। एक तरीका यह कहना होगा कि:

"querytype1" = Particular LINQ expression 
"querytype2" = Particular LINQ expression 

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

+0

आप LINQ अभिव्यक्ति की तुलना कैसे करेंगे? क्या वस्तु आईसीओपरपेबल लागू करती है? –

+0

@KyleC यह मेरा सवाल है। क्या यह पता लगाना संभव है कि दो LINQ अभिव्यक्तियां समान रूप से समान हैं (परिणाम सेट के बावजूद) –

+0

आप आलसी कक्षा और पैटर्न को देखना चाह सकते हैं: http://msdn.microsoft.com/en-us/library/dd642331।एएसपीएक्स –

उत्तर

1

यह मेरा वर्तमान समाधान है।

यह देखते हुए कि, एक भंडार में, हम जैसी कॉल करने जा रहे हैं:

public IEnumerable<MYPOCO> GetData(string someParameter, int anotherParameter); 

इसलिए हम कह सकते हैं कि इन मानकों मापदंड हैं।

public class Criteria 
{ 
    private Dictionary<string, object> _criteria = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); 

    public Criteria Set<T>(string key, T value) 
    { 
     _criteria[key] = value; 
     return this; 
    } // eo Set 

    public T Get<T>(string key) 
    { 
     return _criteria.ContainsKey(key) ? _criteria[key] : default(T); 
    } // eo Get 

    public Dictionary<string, object> Items { get { return _criteria; } } 
} // eo class Criteria 

फिर, मैं Dictionary<TK, TV> के लिए एक विस्तार विधि लिखा था, पर this Stackoverflow answer आधारित: तो, मैं एक Criteria वर्ग, जो मूल रूप से Dictionary<string, object> उदाहरण होते हैं, और कुछ प्रकार के लिए सुरक्षित setters और getters है, सरलीकृत की शुरुआत की। और अंत में, IEqualityComparer<Criteria> कक्षा जो Criteria के प्रकारों के साथ काम करती है।

इसका मतलब यह है अपने कैश अब है मापदंड है, जो मानकों इस संग्रह का में पारित किए गए लेने के लिए निर्धारित है द्वारा keyed: यह भी है जब हम मेरे इस विचार का विस्तार करने की अनुमति देता है

public class MyPocoRepository<TMYPOCO> 
{ 
    private Cache<Criteria, IEnumerable<TMYPOCO>> _cache = new Cache<Criteria, IEnumerable<TMYPOCO>>(CriteriaComparer); // is passed to the dictionary constructor which is actually the cache. 
    public IEnumerable<TMYPOCO> GetData(string someParameter, int anotherParameter) 
    { 
     Criteria criteria = new Criteria(); 
     criteria.Set("someParameter", someParameter) 
       .Set("anotherParameter", anotherParameter); 
     // we can check the cache now based on this... 
    } // eo GetData 
} // eo MyPocoRepository<TMYPOCO> 

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

+0

यदि आप 'शब्दकोश <मानदंड, जो भी> ' –

+0

@ चार्ल्सलैम्बर्ट में चाबियाँ के रूप में उदाहरणों को स्टोर करना चाहते हैं, तो आपको' बराबर 'और' गेटहाशकोड 'ओवरराइड करने की आवश्यकता है, जो मुझे सिखाएगा कि जब मैं अपने सामने कोड न रखूं पोस्ट लिखा था। कृपया संपादन देखें, यह 'IEqualityComparer <>' है –

1

रणनीति: तुलना करें एसक्यूएल उत्पादन

एक रणनीति प्रदान की एसक्यूएल पाठ + पैरामीटर निकालते हैं और निर्धारित करने के लिए अगर वे प्रदान की एसक्यूएल + एक और IQueryable से पैरामीटर के रूप में ही कर रहे हैं हो सकता है।

अधिक जानकारी के लिए Retrieve LINQ to sql statement (IQueryable) WITH parameters देखें।

+0

यदि आप अन्य सवालों के कुछ जवाबों को देखते हैं, तो यह आश्चर्यजनक होगा जब मैं प्रदर्शन प्रभावों के बारे में पूछता हूं। हां, डेटा सेट जो हम बात कर रहे हैं वह अविश्वसनीय रूप से बड़ा हो सकता है, और 'चयन' कथन स्वयं बहुत बड़ा होगा (हां, यह चीजों को कई तृतीय-पक्ष समाधानों से खींचता है, इसलिए मैं वास्तव में क्वेरी को छोटा नहीं कर सकता) । यह संभावित रूप से कुंजी की तुलना में "1kb +" श्रेणी में डाल देगा। सोचा, सच में, यह आवश्यकतानुसार कम महंगी (परिमाण के क्रम से) होगा। मुझे लगता है कि मैं सोच रहा था कि क्या हम * हैश * एक LINQ अभिव्यक्ति कर सकते हैं। –

+0

आप कुंजी को हश कर सकते हैं और टकराव की तलाश कर सकते हैं। –

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