繁体   English   中英

列表<t>实现 IQueryable<t></t></t>

[英]List<T> to implement IQueryable<T>

我正在尝试为我的IRepository接口创建一个模拟:

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异常。 如何正确实现此接口以便能够仅将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 ,它会检查 object 是否已经实现IQueryable ,如果是则返回它。

使用new EnumerableQuery<T>(this)代替不执行此检查的AsQueryable


.net 3.5 的解决方法:

return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()

首先转换为IEnumerable<T>所以选择的Select方法将是Enumerable.Select not Queryable.Select 身份 select 然后将返回一个新的 object ,它没有实现IQueryable<T> ,因此检查它是否在AsQueryable中实现失败。

尝试使用base.AsQueryable()而不是this.AsQueryable()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM