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()