我正在尝试为我的 IRepository
接口(interface)创建一个模拟:
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
异常。如何正确实现此接口(interface),以便能够仅使用 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
它检查对象是否已经实现了 IQueryable
如果是,则返回它。
使用 new EnumerableQuery<T>(this)
而不是 AsQueryable
它不执行此检查。
.net 3.5 的解决方法:
return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()
首先转换为 IEnumerable<T>
所以选择了Select
方法将是 Enumerable.Select
不是 Queryable.Select
.然后,身份选择将返回一个未实现 IQueryable<T>
的新对象。 , 所以检查它是否在 AsQueryable
中实现失败。
关于c# - List<T> 实现 IQueryable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6765350/