कृपया कोड की यह लाइन देखें। यह संग्रहीत प्रक्रिया का आविष्कार है, जो ObjectResult<long?>
देता है। आदेश में लंबे समय के मूल्यों को निकालने के लिए मैं चुनें कहा:.NET इकाई फ्रेमवर्क - आईनेमेरेबल वीएस। IQueryable
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
IntelliSense के आधार पर इस का चयन देता है IEnumerable<long>
।
मुझे यकीन नहीं है कि मैंने इसे कहीं पढ़ा है या शायद इस धारणा के लिए उपयोग किया गया है - मैंने हमेशा सोचा था कि जब ईएफ एपीआई IEnumerable
(और IQueryable
नहीं) तो इसका मतलब है कि परिणाम भौतिक हो गए हैं। मतलब वे डेटाबेस से खींच लिया गया है।
मुझे पता चला कि मैं गलत था (या शायद यह एक बग है?)। मैं त्रुटि
मूल रूप से "क्योंकि वहाँ अन्य थ्रेड सत्र में चल रहे हैं नए लेन-देन की अनुमति नहीं है", यह त्रुटि आपको बताता है कि आप जबकि परिवर्तनों को सहेजने की कोशिश कर रहे हो रही है डीबी रीडर अभी भी रिकॉर्ड पढ़ रहा है।
अंततः मैं इसे द्वारा (क्या मैं एक लंबे शॉट माना जाता है) हल और IEnumerable<long>
...
तो अमल में लाना करने के लिए ToArray()
कॉल जोड़ा - लब्बोलुआब यह है - मैं उम्मीद करनी चाहिए एफई से IEnumerable
परिणाम है कि हेवन परिणाम को रोकने के लिए अभी तक भौतिक नहीं है? यदि हां तो क्या यह जानने का कोई तरीका है कि IEnumerable
भौतिक हो गया है या नहीं?
धन्यवाद और क्षमा याचना अगर यह उन 'duhhh द्वारा पूछे गये सवालों में से एक है ... :)
मैं वहाँ कुछ भी विशेष रूप से एफई के लिए दस्तावेज है कि अगर यकीन नहीं है, लेकिन सामान्य में Linq, के लिए एक 'IEnumerable' है और नहीं "materialized" एक 'IQueryable ' से - दोनों आम तौर पर आस्थगित निष्पादन उपयोग करने के लिए माना जाता है। –
@Damien_The_Unbeliever: हालांकि, मुझे लगता है कि ऑब्जेक्ट रेसल्ट फ़ंक्शन कहलाए जाने पर हमेशा निष्पादित होगा ... (इस मामले में FindCoursesWithKeywords) –