c# - List<T> 实现 IQueryable<T>

标签 c# .net linq iqueryable

我正在尝试为我的 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);
}

异常截图如下:

Exception

最佳答案

你的问题的原因是,如果你执行 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/

相关文章:

.net - IIS 7.5 自动启动无法与使用 Web Activator 的 Ninject 一起使用

c# - 如何存储 Linq 查询并在以后使用?

C# Array.FindIndex 当前对象的索引

c# - 如何使用缺少元素的 Linq 进行 OrderBy?

c# - 不同范围的属性 - 公共(public) getter 和内部 setter

c# - 使用 "Control.CheckForIllegalCrossThreadCalls = false"是个好主意吗

c# - 获取 Firefox 网址

c# - 即使不在授权集中,反射也不受限制

.net - 如何仅序列化某些对象属性

c# - 我是否需要将 Azure 函数作为异步方法运行?