Sly*_*Sly 25 .net c# linq iqueryable
我正在尝试为我的IRepository界面创建一个模拟:
public interface IRepository<T> : ICollection<T>, IQueryable<T>
{
}
Run Code Online (Sandbox Code Playgroud)
有了这个实现:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用它时,我会遇到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);
}
Run Code Online (Sandbox Code Playgroud)
这是异常的截图:

Cod*_*aos 29
你的问题的原因是,如果你执行AsQueryable它检查对象是否已经实现IQueryable,如果是,则返回它.
使用new EnumerableQuery<T>(this)而AsQueryable不是执行此检查.
.net 3.5的解决方法:
return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()
Run Code Online (Sandbox Code Playgroud)
首先施法,IEnumerable<T>所以选择的Select方法Enumerable.Select不会Queryable.Select.然后,身份选择将返回一个未实现的新对象IQueryable<T>,因此检查它是否实现AsQueryable失败.
| 归档时间: |
|
| 查看次数: |
26305 次 |
| 最近记录: |