2011-06-09 7 views
7

इकाई की रूपरेखा में, यदि मैं निम्न करें:क्या एक IQueryable ऑब्जेक्ट के एकाधिक मूल्यांकन डेटाबेस को कई बार हिट करते हैं?

var count = myIQueryable.Count(); 
var list = myIQueryable.ToList(); 

कि दो बार डाटाबेस हिट करता है? या सिर्फ एक बार?

उत्तर

10

आदेश में प्रभावी रूप प्रविष्टियों की संख्या गिनी करने के लिए, ढांचे क्वेरी का मूल्यांकन करने, इस प्रकार डाटाबेस मार की जरूरत है। हालांकि, क्योंकि क्वेरी() और ToList() के बीच क्वेरी बदल सकती है, इसे फिर से मूल्यांकन करना होगा। निम्नलिखित पर विचार करें:

var myIQueryable = my.db<SomeModel>(); // IQueryable<SomeModel> 
var countQuery = myIQueryable.Count(); // 10 
MakeAdditions(myIQueryable, 10);  // adds 10 items 
var list = myIQueryable.ToList();  // List<SomeModel> count=20 
MakeAdditions(myIQueryable, 10); 
var countList = list.Count();   // still 20, List never changed 

एक और तरीका रखें, IQueryable के खिलाफ सभी कॉल अभी भी इसके प्रश्नों के अनुसार चल रहे हैं। एक सूची में एक प्रश्न पर कब्जा करने के बाद, आप विशेष रूप से अपने इन-स्मृति सूची, परिवर्तन है कि IQueryable के डेटा स्रोत होने की स्वतंत्र के साथ काम कर रहे हैं।

+0

तो पर थोड़ा और अधिक विस्तार किया है, भले ही आप एक ही का मूल्यांकन IQueryable पर अतिरिक्त कर रहे हैं, के लिए एक फिल्टर जोड़ने उदाहरण के लिए, IQueryable अपने पिछले परिणाम का उपयोग नहीं करता है? – dmorganb

+2

वास्तव में, IQueryable की प्रकृति क्वेरी जब यह कहा जाता है evaulate है। यदि आप एक पूर्व मूल्यांकन का उपयोग करना चाहते हैं, तो आप = पहले यह कब्जा करना होगा। 'var सूची myIQueryable। ToList(); MakeAdditions(); वर संख्या = list.Count(); ' – max

+0

आप पेजिंग नहीं कर रहे हैं, साथ ही बस ToList साथ परिणाम मिल सकते हैं, तो इसकी गणना संपत्ति ताकि आप डेटाबेस दो बार मार नहीं कर रहे हैं का उपयोग करें । दूसरी ओर, यदि आप डेटा पेजिंग रहे हैं, तो अपने ToList गणना की तुलना में कम परिणाम प्राप्त हो जाएगा, ताकि आप वें पर दो अलग-अलग हिट बनाने के लिए होगा ई डेटाबेस। मुझे आश्चर्य है कि, तथापि, वहाँ अगर गणना तो बुला (पृष्ठांकित) क्वेरी चलाने, बनाम (पृष्ठांकित) क्वेरी चलाने तो गणना को फोन करके किसी भी प्रदर्शन वृद्धि हुई है। क्या किसी भी तरह से कैश के परिणाम या योजनाएं उपयोगी होंगी? – Triynko

5

हाँ, यह डेटाबेस में दो बार, के रूप में दोनों Count और ToList बेसब्री से मूल्यांकन किया जाता है मारा है। आप सिर्फ एक बार इसे का उपयोग करना चाहते हैं, निम्न कार्य करें:

var list = myIQueryable.ToList(); 
var count = list.Count; 
+0

मेरे द्वारा 30 सेकंड :( –

+0

धन्यवाद मारो, कि क्या करेंगे। – dmorganb

+0

मैं मैक्सवेल के जवाब में स्वीकार कर लिया है क्योंकि यह यह – dmorganb

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