[英]List<T> to implement IQueryable<T>
我正在嘗試為我的IRepository
接口創建一個模擬:
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);
}
這是異常的屏幕截圖:
出現問題的原因是,如果您執行AsQueryable
,它會檢查 object 是否已經實現IQueryable
,如果是則返回它。
使用new EnumerableQuery<T>(this)
代替不執行此檢查的AsQueryable
。
.net 3.5 的解決方法:
return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()
首先轉換為IEnumerable<T>
所以選擇的Select
方法將是Enumerable.Select
not Queryable.Select
。 身份 select 然后將返回一個新的 object ,它沒有實現IQueryable<T>
,因此檢查它是否在AsQueryable
中實現失敗。
嘗試使用base.AsQueryable()
而不是this.AsQueryable()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.