列表实现 IQueryable

发布于 2024-11-25 07:21:21 字数 1178 浏览 2 评论 0原文

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

这是异常的屏幕截图:

Exception

I'm trying to create a mock for my IRepository interface:

public interface IRepository<T> : ICollection<T>, IQueryable<T>
{
}

With this implementation:

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;
        }
    }
}

But when I use it, I'm getting StackOverflow exception. How to implement this interface correctly to be able to use just a List as a repository?

Usage is very simple

[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);
}

Here is screenshot of exception:

Exception

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

红衣飘飘貌似仙 2024-12-02 07:21:21

问题的原因是,如果您执行 AsQueryable ,它会检查对象是否已经实现了 IQueryable ,如果是,则返回它。

使用 new EnumerableQuery(this) 而不是 AsQueryable,后者不执行此检查。


.net 3.5 的解决方法:

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

首先转换为 IEnumerable,因此所选的 Select 方法将是 Enumerable.Select 而不是 Queryable。选择。然后,身份选择将返回一个未实现 IQueryable 的新对象,因此检查它是否在 AsQueryable 中实现的检查失败。

The reason for your problem is that if you perform AsQueryable it checks if the object already implements IQueryable and if yes returns it.

Use new EnumerableQuery<T>(this) instead of AsQueryable which doesn't perform this check.


Workaround for .net 3.5:

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

First casts to IEnumerable<T> so the chosen Select method will be Enumerable.Select not Queryable.Select. The identity select will then return a new object that does not implement IQueryable<T>, so the check if it's implemented in AsQueryable fails.

小镇女孩 2024-12-02 07:21:21

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

Try using base.AsQueryable() instead of this.AsQueryable().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文