2010-05-25 16 views
6

ठीक है मेरे पास निम्न, सेट-अप और बढ़िया काम है। कोड की इन पंक्तियों को डीएएल एंटिटी (सबसनिक) से व्यूमोडेल में रूपांतरण करना चाहिए।लूप टू LINQ रूपांतरण -

IList<ProductOptionModel> OptionsRetData = new List<ProductOptionModel>(); 

    foreach (var CurProductOption in this.ProductOptions) 
    { 
     OptionsRetData.Add(CurProductOption.ToDataModel()); 
    } 

    returnData.Options = OptionsRetData.AsEnumerable(); 

मैं इसे LINQ सिंगल लाइन स्टेटमेंट में कनवर्ट करना चाहता हूं और निम्न के साथ आया हूं।

returnData.Options = this.ProductOptions.Select(o => o.ToDataModel()); 

और निम्न त्रुटि प्राप्त कर रहा हूं।

Server Error in '/' Application. 
Sequence contains no matching element 

तो पहला नियम क्यों काम करता है लेकिन LINQ नहीं है और, इसे हल करने के लिए मैं क्या कदम उठा सकता हूं।

ढेर SubSonic.Extensions.Database.Load [टी] (IDataReader आरडीआर, टी आइटम पर ट्रेस

पर System.Linq.Enumerable.First [TSource] (IEnumerable 1 source, Func 2 विधेय), सूची 1 ColumnNames) at SubSonic.Extensions.Database.ToEnumerable[T](IDataReader rdr, List 1 COLUMNNAMES) पर SubSonic.Linq.Structure.DbQueryProvider.Execute [टी] (QueryCommand 1 query, Object[] paramValues) at lambda_method(Closure) at SubSonic.Linq.Structure.DbQueryProvider.Execute(Expression expression) at SubSonic.Linq.Structure.Query 1.GetEnumerator()

हो सकता है कि इस सबसोनिक के साथ क्या करना है?

+2

अपवाद का कॉल स्टैक क्या है? – SLaks

+0

ToDataModel() का रिटर्न प्रकार क्या है? –

+0

@ डेव स्वर्सकी - रिटर्न टाइप ProductOptionModel – LiamB

उत्तर

7

एक संभावना यह है कि यह काम नहीं कर रहा है क्योंकि आपने उस समय को बदल दिया है जिस पर क्वेरी भौतिक हो गई है। इस के बजाय करने के लिए कोड में परिवर्तित करें:

returnData.Options = this.ProductOptions.Select(o => o.ToDataModel()).ToList(); 

कि क्वेरी एक ही समय में यह पहले था पर मूल्यांकन किया जा करने के लिए मजबूर होंगे।

संपादित करें: आपका स्टैक ट्रेस First() दिखा रहा है किसी भी तरह से कहा जा रहा है, लेकिन हमारे पास आपके द्वारा दिखाए गए कोड में इसके बारे में कुछ भी नहीं मिला है ... कोई विचार जहां यह हो रहा है?

संपादित करें: मुझे अंतर पता चला है - और मैं पहले ऐसा नहीं करने के लिए मूर्ख हूं। आप प्रक्षेपण प्रक्रिया में किया जा करने के लिए मजबूर करना चाहते हैं: AsEnumerable करने के लिए अतिरिक्त कॉल का मतलब है

returnData.Options = this.ProductOptions 
         .AsEnumerable() 
         .Select(o => o.ToDataModel()) 
         .ToList(); 

कि यह, Enumerable.Select अधिभार जो कहा जाता हो जाता है हो जाएगा यह अपने मूल कोड के बराबर बना रही है।

+0

@ जोन स्कीट - उत्तर के लिए धन्यवाद। .ToList() परिणाम जोड़ना वह एक ही त्रुटि है। (बस उस दृश्य पर दृश्य के बजाय अब) – LiamB

+0

@ जोन स्कीट - स्नीकी संदेह है कि यह सबसोनिक के साथ है। जैसा कि मैं कोई वास्तविक कॉल नहीं करता हूं। फर्स्ट(); – LiamB

+0

@ पिनो: मेरे पास एक और विचार है। अब संपादन ... –

0
this.ProductOptions.Select(o => o.ToDataModel()).ToList<ProductOptionModel>(); 
+0

उदाहरण पंक्ति का उपयोग करते समय एक ही समस्या। – LiamB

-1

मुझे लगता है कि आप this.ProductOptions की लंबाई LINQ बयान से पहले की जांच करने के लिए है।

तो शायद (शून्य के लिए चेक के बिना संशोधित):

returnData.Options = (this.ProductOptions.Length > 0) ? this.ProductOptions.Select(o => o.ToDataModel()) : new List<ProductOptionModel>().AsEnumerable(); 
+0

लूप तब क्यों काम करता है? – LiamB

+0

शायद शून्य के लिए जांच करने की कोई आवश्यकता नहीं है। लूप काम करता है क्योंकि लंबाई 0 के साथ, कार्यक्रम का प्रवाह कभी लूप में प्रवेश नहीं करता है। –

+0

अगर इसे कोई मान नहीं मिलता है तो चयन विफल नहीं होना चाहिए ... इसे केवल खाली परिणाम देना चाहिए। जैसा कि मैंने कहा, –

2

जैसा कि मैंने आपको पहले विधि का उपयोग कर रहे कहा। आप इसे FirstOrDefault में बदलना चाहते हैं। इसे हल किया जाएगा। या क्या आप बदल सकते हैं?

स्टैक ट्रेस

System.Linq.Enumerable पर।पहले

+0

, मैं सीधे इसे कॉल नहीं कर रहा हूं। यह सबसोनिक फाइलों में गहरा लगता है। शायद यह मुद्दा पैदा कर रहा है? – LiamB

+0

हाँ। यह क्यों हो रहा है। संपादित करें। हो सकता है कि कोशिश करें कथन कथन का उपयोग कर इसे ठीक कर देंगे। क्या आपने कोशिश की? – cem

+0

जॉन स्कीट्स उत्तर देखें। – LiamB

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