2009-09-01 21 views
8

पर लिनक्स परिणाम कास्ट करें मैंने अपनी इकाइयों को अपने प्रकार के लिए विशिष्ट इंटरफेस को लागू करने के लिए विस्तारित किया है।सूची <MyInterface>

"LINQ संस्थाओं को केवल समर्थन करता है कास्टिंग इकाई डेटा मॉडल आदिम प्रकार"

असल में क्या:

var results = from x in context.MyEntityTable 
       where x.AProperty == AValue 
       select x; 

return results.Count() > 0 ? results.Cast<IApplicationEntity>().ToList() : null; 

हालांकि, मैं निम्नलिखित त्रुटि मिलती रहती है: मैं निम्न क्वेरी प्रदर्शन करने के लिए कोशिश कर रहा हूँ मैं हमेशा कच्चे इकाई प्रकार से परिणाम को इंटरफ़ेस की एक सामान्य सूची में परिवर्तित करना चाहता हूं।

क्या यह संभव है?

उत्तर

20

आप क्लाइंट पर डाली कर सकते हैं, बुला AsEnumerable विस्तार विधि द्वारा दरकिनार इकाई की रूपरेखा क्वेरी अनुवाद परत:

return results.Any() 
     ? results.AsEnumerable().Cast<IApplicationEntity>().ToList() 
     : null; 

हालांकि, यह Count जांच करने का आदेश उल्टा करने के लिए बेहतर है:

var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList(); 
return list.Count == 0 ? null : list; 
+1

+1, हालांकि यह दो डीबी प्रश्नों (गणना और टोलिस्ट के लिए) निष्पादित करेगा ... संभवतः टोलिस्ट को कॉल करना बेहतर होगा, फिर –

+0

@ थॉमस आइटम की संख्या की जांच करें: दूसरी क्वेरी देखें। –

+0

हां, यह बेहतर है;) –

0
return results.Count() > 0 ? 
results.Select(result => (IApplicationEntity)result) 
.ToList() : null; 
+0

मुझे नहीं लगता कि यह काम करेगा, इसी कारण से कास्ट विधि नहीं है। आपको क्वेरी को IENumerable पहले –

+0

में कनवर्ट करने की आवश्यकता है संदेश में कहा गया है कि यह नहीं जानता कि यह कास्ट() ऑपरेटर को linq में इकाइयों में कैसे परिवर्तित करें। यह वास्तव में कोड है जो linq प्रदाता (उदाहरण के लिए लिंक से एसक्यूएल, ऑब्जेक्ट्स के लिए linq आदि) द्वारा लिखा गया है अन्य पोस्टर्स ने कॉल को ऑब्जेक्ट्स के उपयोग को मजबूर करने के लिए कॉल को असीमित करने का प्रस्ताव दिया है और इस प्रकार कास्ट() ऑपरेटर सफल होता है। मैं वही काम कर रहा था लेकिन स्पष्ट रूप से कोड में एक कास्ट पेश करके सी # का उपयोग कर रहा था। इसे आज़माएं और अगर यह काम करता है तो मुझे बताएं। – Spence

3

आप जटिल प्रकार के लिए अपने परिणामों कास्ट करना चाहते हैं, तो आप LINQ entiti को LINQ बजाय वस्तुओं के लिए उपयोग करने के लिए कोड के लिए मजबूर करने की जरूरत है तों।

कास्ट करने से पहले AsEnumerable विस्तार विधि को कॉल करना यहां चाल है।

निम्नलिखित का प्रयास करें:

var results = from x in context.MyEntityTable 
       where x.AProperty == AValue 
       select x; 

return results.AsEnumerable().Cast<IApplicationEntity>().ToList(); 

भी ध्यान रखें कि यह, गणनीय पर Count() जाँच करने के लिए समझदारी नहीं है, क्योंकि इसका मतलब है कि संग्रह में दो बार से अधिक दोहराया है।

+0

असल में, यह काम नहीं करेगा। आपको कास्ट से पहले 'AsEnumerable' * करना चाहिए। अन्यथा, ईएफ प्रदाता पर चलाने के लिए इसे एक क्वेरी में अनुवाद करने का प्रयास करेगा। –

+0

@ मेहरदाद: अपने स्वयं के अच्छे के लिए बहुत तेज़। मैंने आपकी टिप्पणी से ठीक पहले पोस्ट संपादित किया था। ;) – Noldorin

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