C# 列表<;T>;实施IQueryable<;T>;
我正在尝试为我的C# 列表<;T>;实施IQueryable<;T>;,c#,.net,linq,iqueryable,C#,.net,Linq,Iqueryable,我正在尝试为我的IRepository界面创建一个模拟: public interface IRepository<T> : ICollection<T>, IQueryable<T> { } 以下是异常的屏幕截图: 问题的原因是,如果执行AsQueryable,它会检查对象是否已经实现了IQueryable,如果是,则返回它 使用new EnumerableQuery(this)代替不执行此检查的AsQueryable .net 3.5的变通方法: re
IRepository
界面创建一个模拟:
public interface IRepository<T> : ICollection<T>, IQueryable<T>
{
}
以下是异常的屏幕截图:
问题的原因是,如果执行
AsQueryable
,它会检查对象是否已经实现了IQueryable
,如果是,则返回它
使用new EnumerableQuery(this)
代替不执行此检查的AsQueryable
.net 3.5的变通方法:
return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()
return((IEnumerable)this)。选择(x=>x)。AsQueryable()
首先强制转换为
IEnumerable
,因此所选的Select
方法将是可枚举的。选择而不是可查询的。选择。然后,identity select将返回一个未实现IQueryable
的新对象,因此检查它是否在AsQueryable
中实现失败。尝试使用base.AsQueryable()
而不是this.AsQueryable()
“但是当我使用它时”——显示代码?给我们看堆栈跟踪?你想做什么?我最好的猜测是你希望有魔法。行为完全是预期的。采用IEnumerable
的构造函数是公共的。至少在.net 4上进行检查您包括了转换到IEnumerable
和Select
?第二个选项完成了这项工作。谢谢我觉得很奇怪。在我的特定案例中,这导致我们的服务器使用100%的CPU,调试显示所有db行都被实例化为中的对象memory@dksh这是为了在IEnumerable
上重用IQueryable
代码,例如用于测试。它不是为查询SQL数据库而设计的,因为基于任何IEnumerable
,即使在转换为IQueryable
时,也需要迭代所有内容,而不是将查询转换为SQL。基类没有这样的扩展,这也不会有任何帮助,因为检查IQueryable
是否已实现使用运行时类型。这不是虚拟的方法。
[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);
}
return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()