2011-07-20 25 views
25

IRepository arabirim için bir alay oluşturmaya çalışıyorum:IQueryable <T>'yi uygulamak için <T>'i listeleyin

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

Bu uygulama ile:

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; 
     } 
    } 
} 

Ancak, kullandığımda StackOverflow istisnası alıyorum. Sadece List'i depo olarak kullanabilmek için bu arayüz nasıl doğru şekilde uygulanır?

Kullanımı çok basit

[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); 
} 

İşte istisna screenshot:

Exception

+2

"Ama kullandığımda" - bize kodu göster? Bize yığın izini göster? – cdhowie

+0

Ne yapmaya çalışıyorsunuz? En iyi tahminim, biraz sihir beklemektir. Davranış tamamen bekleniyor. – leppie

cevap

29

senin sorunun nedeni AsQueryable gerçekleştirirseniz nesne zaten IQueryable uygular ve eğer denetler olmasıdır eğer evet döndürürse. Bu denetimi gerçekleştirmeyen yerine new EnumerableQuery<T>(this) kullanın. .net 3.5 için


Çözüm:

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

İlk böylece seçilmiş Select yöntem Enumerable.Select değil Queryable.Select olacak IEnumerable<T> atmalarını. Kimlik seçimi daha sonra IQueryable<T> uygulanmayan yeni bir nesne döndürecek, böylece AsQueryable uygulamasında uygulanıp uygulanmadığı kontrol edilemedi.

+0

Korunan kontrollu mu? .. – Sly

+0

"IEnumerable " adlı yapıcı herkese açıktır. Http://msdn.microsoft.com/en-us/library/cc190806.aspx adresine bakın. En az on. Net 4 – CodesInChaos

+0

@ CodeInChaos: .NET 4. 0'da yeni. – leppie

1

this.AsQueryable() yerine base.AsQueryable() kullanmayı deneyin.

+0

Temel sınıf böyle bir uzantıya sahip değil – Sly

+0

Zaten IQueryable 'uygulanmış olup olmadığını kontrol etmediğinden, çalışma zamanı türünü kullanır. Bu sanal bir yöntem değil. – CodesInChaos

İlgili konular