2010-03-16 10 views
5

ध्यान दें कि _src IQueryable<U> का उत्तराधिकारी है और वी new() का उत्तराधिकारी है;सी # लिंक चुनिंदा विधि में समस्या का चयन करें

मैंने निम्नलिखित कथन लिखा, कोई वाक्यविन्यास त्रुटि नहीं है।

IQueryable<V> a = from s in _src where (s.Right - 1 == s.Left) select new V(); 

लेकिन अगर मुझे फिर से लिखा है यह इस प्रकार है, दृश्य स्टूडियो संपादक में "चुनें" एक त्रुटि की शिकायत

IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(s=> new V()); 

त्रुटि है:

The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly. 
Candidates are: 
    System.Collections.Generic.IEnumerable<V> Select<U,V>(this System.Collections.Generic.IEnumerable<U>, System.Func<U,V>) (in class Enumerable) 
    System.Linq.IQueryable<V> Select<U,V>(this System.Linq.IQueryable<U>, System.Linq.Expressions.Expression<System.Func<U,V>>) (in class Queryable) 

किसी को समझा सकते हैं इस घटना, और त्रुटि को ठीक करने का समाधान क्या है?

=== संपादित करें (2010-03-16 5:35 बजे) ===

धन्यवाद माइक दो। मैंने आपके जैसे एक साधारण उदाहरण की भी कोशिश की। यह काम करता है लेकिन यह मेरे में नहीं करता है। मैंने कोड को निम्नानुसार पोस्ट किया:

public class NSM<U, V> where U : IQueryable<U> where V : new() 
    { 
    private U _src; 
    public NSM(U source) { _src = source; } 
    public IQueryable<V> LeafNodes 
    { 
     get 
     { 
      return from s in _src where (s.Right - 1 == s.Left) select new V(); 
     } 
    } 
    } 

मैं चाहता हूं कि LeafNodes फ़ंक्शन को linq विधि श्रृंखला विधि में फिर से लिखा जाए। कोई उपाय?

+0

धन्यवाद आवंटित करने के लिए। पहले के बराबर बयान क्या है? – Gnought

+0

आपके द्वारा जो कोड जोड़ा गया है वह तब तक संकलित नहीं होगा जब तक कि यू कुछ ऐसा न हो जिसमें दाएं और बाएं संपत्ति हों। इसलिए यह केवल 'IQueryable ' नहीं हो सकता है जब तक कि वहां 'यू: ILeftRight' या कुछ नहीं है। –

+0

मैंने इसे आपके अद्यतन नमूने के लिए धन्यवाद दिया। नीचे अद्यतन उत्तर देखें। अधिक जानकारी प्रदान करने के लिए धन्यवाद। –

उत्तर

1

_src का प्रकार क्या है? क्या यह सीधे IQueryable लागू करता है? मैं पूछता हूं क्योंकि मैं काम करने के लिए जो दिखा रहा हूं उसका सरलीकृत उदाहरण प्राप्त कर सकता हूं।

IQueryable<int> ints = Enumerable.Range(4, 12).AsQueryable(); 

IQueryable<decimal> foo = from s in ints where s > 7 select s * 4.2m; 

IQueryable<decimal> bar = ints.Where(s => s > 7).Select(s => s * 4.2m); 

इनमें से दोनों मेरे लिए काम करते हैं। मुझे लगता है कि अगर संकलक जानता है कि इनट्स (या आपके मामले में _ एसआरसी) एक IQueryable है तो यह सही अधिभार को कॉल करेगा। या मैं पूरी तरह से कुछ याद कर रहा हूँ? शायद मैंने इसे बढ़ा दिया और थोड़ी सी जानकारी खो दी।

संपादित करें: कुछ बदलावों के साथ नए नमूना कोड का उपयोग करने के लिए इसे विस्तारित करें।

चाल कि Queryable.Select एक Expression<Func<X, V>> लेता है और Enumerable.Select एक Func<X,V> तो आप बस

Expression<Func<X,V>> expression = s => new V(); 
IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(expression); 
1

त्रुटि occurres क्योंकि संकलक क्या तरीकों आप निष्पादित करने के लिए चाहते हैं का चयन नहीं कर सकते हैं: Select विस्तार विधि IEnumerable<T> या Select विस्तार विधि के लिए IQueryable<T>

1
समस्या आप में चला रहे हैं

के लिए में चयन के लिए 2 विभिन्न उपयोगों देखते हैं कि है आपका दूसरा उदाहरण, और आपके पास दोनों को प्राप्त करने के लिए उचित उपयोग कथन है। संकलक उस कथन से बाहर नहीं आ सकता जिसे आप उपयोग करना चाहते हैं। यदि आपको अब इसकी आवश्यकता नहीं है, तो किसी भी अन्य तरीके से इसका चयन करने या निकालने के लिए आपको एक और विशेष कॉल का उपयोग करना होगा, या किसी अन्य तरीके से स्पष्ट करें कि आप किस का उपयोग करना चाहते हैं।

+0

देखें यदि मैं निम्नानुसार चयन करने के लिए "AsQueryable()" जोड़ता हूं: IQueryable d = _src.Where (एस => एस। राइट - 1 == एस। लेफ्ट) .एक्विटेबल()। चुनें (एस => नया वी()); त्रुटि भी वही है। – Gnought

0

हल करने के लिए Select

करने या मूल संहिता से Expression संस्करण उपलब्ध कराने की आवश्यकता लेता है कंपाइलर के लिए अस्पष्टता AsEnumerable() फ़ंक्शन

का उपयोग करें
src.AsEnumerable().Select(s => new V()); 

या IQueryable करने के लिए सभी

IQueryable<V> x = src.AsEnumerable().Select(s => new V()).AsQueryable(); 
+0

लेकिन यह IQueryable के बजाय IEUumerable वापस करेगा। वापसी प्रकार बदलने के बिना क्या तय है? – Gnought

+0

@Gnought मैं इसे पोस्ट संपादित करने के लिए जोड़ता हूं। – Cornelius

+0

आपका परीक्षण धन्यवाद। – Gnought

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