2011-07-20 12 views
25

मैं अपने IRepository इंटरफेस के लिए एक नकली बनाने के लिए कोशिश कर रहा हूँ:सूची <T> लागू करने के लिए IQueryable <T>

public interface IRepository<T> : ICollection<T>, IQueryable<T> 
{ 
} 

इस कार्यान्वयन के साथ:

public class RepositoryFake<T> : List<T>, IRepository<T> 
{ 
    public Expression Expression 
    { 
     get 
     { 
      return this.AsQueryable().Expression; 
     } 
    } 

    public Type ElementType 
    { 
     get 
     { 
      return this.AsQueryable().ElementType; 
     } 
    } 

    public IQueryProvider Provider 
    { 
     get 
     { 
      return this.AsQueryable().Provider; 
     } 
    } 
} 

लेकिन जब मैं इसका इस्तेमाल, मैं हो रही हूँ StackOverflow अपवाद। एक रिपॉजिटरी के रूप में केवल List का उपयोग करने में सक्षम होने के लिए इस इंटरफ़ेस को सही तरीके से कैसे कार्यान्वित करें?

प्रयोग बहुत सरल है

[Test] 
public void Test() 
{ 
    RepositoryFake<User> users = new RepositoryFake<User>(); 
    users.Add(new User()); 

    List<User> list = (from user in users 
       where user.Id == "5" 
       select user).ToList(); 

    Assert.That(list, Is.Empty); 
} 

यहाँ अपवाद के स्क्रीनशॉट है:

Exception

+2

"लेकिन जब मैं इसका उपयोग करता हूं" - हमें कोड दिखाएं? हमें स्टैक ट्रेस दिखाएं? – cdhowie

+0

आप क्या करने की कोशिश कर रहे हैं? मेरा सबसे अच्छा अनुमान है कि आप कुछ जादू की उम्मीद कर रहे हैं। व्यवहार पूरी तरह से उम्मीद है। – leppie

उत्तर

29

आपकी समस्या के लिए कारण यह है कि अगर आप AsQueryable प्रदर्शन यह जाँच करता है, तो पहले से ही वस्तु IQueryable लागू करता है और है अगर हाँ इसे वापस कर देता है।

के बजाय new EnumerableQuery<T>(this) का उपयोग करें जो इस चेक को निष्पादित नहीं करता है। .net 3.5 के लिए


वर्कअराउंड:

return ((IEnumerable<T>)this).Select(x=>x).AsQueryable() 

पहले IEnumerable<T> को डाले तो चुना Select विधि Enumerable.Select नहीं Queryable.Select हो जाएगा। पहचान चयन तब एक नई वस्तु वापस कर देगा जो IQueryable<T> लागू नहीं करता है, इसलिए चेक AsQueryable में लागू होने पर यह विफल हो जाता है।

+0

यह संरक्षक संरक्षित है? .. – Sly

+0

एक 'आईनेमेरेबल ' लेने वाला निर्माता सार्वजनिक है। Http://msdn.microsoft.com/en-us/library/cc190806.aspx पर कम से कम .NET 4 – CodesInChaos

+0

@CodeInChaos: .NET में नया 4. – leppie

1

this.AsQueryable() के बजाय base.AsQueryable() का उपयोग करने का प्रयास करें।

+0

बेस क्लास में ऐसा एक्सटेंशन नहीं है – Sly

+0

चेक के बाद से किसी भी तरह की सहायता नहीं करेगा यदि 'IQueryable ' पहले ही लागू हो चुका है रनटाइम प्रकार का उपयोग करता है। यह कोई वर्चुअल विधि नहीं है। – CodesInChaos

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