2010-07-19 13 views
5

कुछ बहुत ही अजीब मेरा कार्यक्रम में हो रहा है:क्या यह एक LINQ आलसी लोडिंग समस्या है?

मैं एक संग्रह पर इस क्वेरी agt.DefaultNr == 1 बनाने के लिए और परिणाम के रूप में 3 आइटम प्राप्त: हर आइटम मैं सेट के लिए

IEnumerable<Agent> favAgents = 
      from agt in builtAgents where agt.DefaultNr == 1 select agt; 

DefaultNr = 0

foreach (Agent noFavAgt in favAgents) 
{ 
    noFavAgt.DefaultNr = 0; 
} 

मैं एक क्वेरी है, लेकिन किसी कारण से मेरी favAgents संग्रह अब खाली है!

IEnumerable<Agent> smallAgents = (from agt in favAgents 
    where agt.tempResultCount < 30 
    orderby agt.tempResultCount descending 
    select agt); 

यहां क्या हो रहा है?

क्या यह एक LINQ आलसी लोडिंग समस्या है?

ऐसा लगता है कि सभी आइटम = 0 सेट करने के बाद कुछ प्रकार की पुनः क्वेरी होगी क्योंकि मेरा संग्रह खाली है!

+0

दो प्रश्नों के बीच संबंध क्या है और इसे मूल्य क्यों वापस करना चाहिए। पहली क्वेरी में 'DefaultNr' प्रॉपर्टी को बदलने के दौरान आप दूसरी क्वेरी में' tempResultCount' प्रॉपर्टी पर फ़िल्टर करते हैं। क्या आप LINQ से ऑब्जेक्ट्स (LINQ ओवर-मेमोरी संग्रह) या कुछ प्रकार के ओ/आरएम उपकरण (जैसे LINQ से SQL) के बारे में बात कर रहे हैं? – Steven

+0

क्या आप वाकई वह संग्रह है जो खाली है और न कि आपके दूसरे प्रश्न के मानदंडों से मेल खाता है? – Paolo

उत्तर

11

यह आलसी लोडिंग नहीं है, यह स्थगित निष्पादन है। जब आप अपना प्रारंभिक गणनीय परिभाषित करते हैं, तो आप क्वेरी को परिभाषित कर रहे हैं, संग्रह नहीं। आप सही हैं कि यह एक आवश्यकता कर रहा है; हर बार जब आप favAgents से अधिक सक्रिय करते हैं, तो यह आपके द्वारा परिभाषित क्वेरी निष्पादित करेगा। यदि आप उस क्वेरी के आधार पर एक सूची बनाना चाहते हैं जो परिवर्तित नहीं होती है, तो ToList() जोड़ें।

var favAgents = 
    (from agt in builtAgents where agt.DefaultNr == 1 select agt).ToList(); 

ऐसा करने से स्मृति में एक सूची बनाई जाएगी और उस समय क्वेरी के परिणाम कैश होंगे।

+0

धन्यवाद। मैंने आज कुछ नया सीखा। – TalkingCode

6

हां, आपका favAgents संग्रह अब खाली हो जाएगा - आपने इसके प्रत्येक तत्व में बिट को "बंद कर दिया है" जिससे यह क्वेरी से मेल खाता है! यदि आप दो बार favAgents से अधिक बार फिर से सक्रिय करते हैं, तो यह क्वेरी को दो बार निष्पादित करेगा। favAgents क्वेरी का प्रतिनिधित्व करता है, परिणाम नहीं।

आप, परिणामों में से एक विशेष सेट की रक्षा का उपयोग ToList या कुछ इसी तरह करना चाहते हैं:

favAgents = favAgents.ToList(); 

कि अमल में लाना होगा क्वेरी - यह एक बार प्रदर्शन और उसके बाद एक सूची में परिणाम याद है, मूल रूप से। ToArray का एक ही प्रभाव होगा, लेकिन परिणामों को इसके बजाय सरणी में संग्रहीत करें।

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