2009-02-10 12 views
7

के गुणों को बदलने की कोशिश कर रहा हूं, मैं जो कुछ सोचता हूं वह करने की कोशिश कर रहा हूं, लेकिन मुझे संदेह है कि मैं बस इतना जानता हूं कि मैं कुछ गलत कर रहा हूं।एक IQueryable संग्रह

IQueryable<CWords> Result 

कहाँ CWords एक वर्ग मैं रूप में परिभाषित किया है इस प्रकार है::

public class CWords 
{ 
    public CWords(){} 
    public string _column1{ get; set; } 
    public float _column2{ get; set; } 

    public void fixData(){} 
} 
मेरी कोड में

, मैं परिणाम के प्रत्येक सदस्य के लिए _column2 क्षेत्र modidy कोशिश कर रहा हूँ मैं एक LINQ क्वेरी मुनाफा होता है। मैंने कोशिश की:

foreach (CWords item in Result) 
{ 
    item.fixData(); 
} 

लेकिन निश्चित रूप से यह काम नहीं किया। आइटम उचित दायरे में नहीं है, इसलिए फिक्सडेटा में किए गए कोई भी बदलाव परिणाम में नहीं ले रहे थे।

Bcause आप नहीं IQueryable में सूचकांक, इस के लिए मेरे ठीक निम्न करने के लिए था कर सकते हैं:

var items = goodWords.ToList(); 

for (int i = 0; i < items.Count(); i++) 
    { 
    items[i].fixData(); 
    } 

सही तरीका यह है कि है?

उत्तर

13

ब्रैंडन, यह एक सामान्य गलती है। देखें, LINQ से लौटा IQueryable वास्तव में आपके आइटम नहीं है, इसलिए आप इसमें शामिल नहीं कर सकते हैं। जब आप वास्तव में वस्तुओं के लिए पूछते हैं तो क्वेरी करने के लिए इसमें केवल पर्याप्त जानकारी होती है। इसे "deferred execution" कहा जाता है, क्योंकि जब आप select पर क्वेरी निष्पादित नहीं की जाती है, लेकिन बाद में, जब आप परिणामों की गणना करते हैं। आप "linq स्थगित निष्पादन" की खोज कर सकते हैं और बहुत से लोगों को यह बताने की कोशिश कर रहे हैं कि यह कैसे काम करता है।

जब आप अपना foreach करते हैं, तो क्वेरी चलती है और आप प्रत्येक आइटम पर फिक्सडाटा() को कॉल कर रहे हैं, जैसा आपने इरादा किया था। हालांकि, जब आप IQueryable को फिर से एक्सेस करते हैं, तो आप दूसरी बार क्वेरी निष्पादित करेंगे, और (आपके द्वारा उपयोग किए जा रहे LINQ प्रदाता के आधार पर) आप दूसरी बार मूल अन-संशोधित आइटम ला सकते हैं।

IQueryable पर ToList() को कॉल करके, आप क्वेरी के सभी परिणामों के साथ एक इन-मेमोरी सूची बना रहे हैं। अब आप इस सूची में अनुक्रमित कर सकते हैं और क्वेरी को निष्पादित किए बिना आप जो कुछ भी चाहते हैं उसे एक्सेस कर सकते हैं। यदि आप स्मृति में सभी आइटम (छोटे परिणाम सेट) के साथ ठीक हैं, तो ToList() का उपयोग करना आपके लिए एक अच्छा समाधान हो सकता है।

@PaulG, आप सही हैं किके बजाय foreach का उपयोग कर सकते हैं, लेकिन उन्हें सूची में संदर्भ सहेजना चाहिए या अन्यथा वह सही है जहां उन्होंने शुरू किया (एक IQueryable के साथ)।

var items = goodWords.ToList(); 

foreach (var item in items) 
{ 
    item.fixData(); 
} 
0

मेरा मानना ​​है कि आपके अच्छे शब्द IQueryable<CWords> प्रकार हैं?

तो ऐसा क्यों नहीं? जब LINQ का उपयोग कर

foreach (CWords item in goodWords.ToList()) 
{ 
    item.fixData(); 
} 
संबंधित मुद्दे