【问题标题】:How do you transfer the execution of a Expression created by an IQueryable object to a IEnumerable?如何将由 IQueryable 对象创建的 Expression 的执行转移到 IEnumerable?
【发布时间】:2010-10-04 22:19:29
【问题描述】:

在我的代码中,我想让我的存储库 IQueryable。这样,选择的标准将是一个 linq 表达式树。

现在,如果我想从理论上模拟我的存储库,这很容易:只需实现我的存储库的接口(它也是一个 IQueryable 对象)。

我的模拟存储库实现将只是一个内存集合,但我的问题是:你知道一种简单的方法来实现我的模拟的 IQueryable 接口,将查询传输到我的内存集合(IEnumerable)吗?

感谢您的回复,

一定的精度

我的存储库的客户端对象将以这种方式使用我的存储库:

var result = from entry in MyRepository where entry.Product == "SomeProduct" select entry;

ToList 或 AsEnumerable 的作用是执行查询并将结果作为 List 或 IEnumerable 返回。但我必须在我的存储库上实现 IQueryable 接口,使用 IQueryProvider 将调用中的表达式转换为 IEnumerable 对象。

解决方案

解决方案的实现是将调用 IQueryable 委托给我使用 AsQueryable 的内存集合。

public class MockRepository : IQueryable<DomainObject>
    {
        private List<DomainObject> inMemoryList = new List<DomainObject>();

        #region IEnumerable<DomainObject> Members

        public IEnumerator<DomainObject> GetEnumerator()
        {
            return inMemoryList.GetEnumerator();
        }

        #endregion

        #region IEnumerable Members

        IEnumerator IEnumerable.GetEnumerator()
        {
            return inMemoryList.GetEnumerator();
        }

        #endregion

        #region IQueryable Members

        public Type ElementType
        {
            get
            {
                return inMemoryList.AsQueryable().ElementType;
            }
        }

        public Expression Expression
        {
            get
            {
                return inMemoryList.AsQueryable().Expression;
            }
        }

        public IQueryProvider Provider
        {
            get
            {
                return inMemoryList.AsQueryable().Provider;
            }
        }

        #endregion
    }

【问题讨论】:

    标签: linq ienumerable expression iqueryable


    【解决方案1】:

    在你的模拟上使用AsQueryable。现在它们是可查询的,您可以像对待任何其他可查询的一样对待它们。

    【讨论】:

    • 在此之前我不能做任何客户调用我的存储库 AsQueryable (如果我理解你的意思),但多亏了你,我找到了一个很好的解决方案!我只需要将我的存储库的 IQueryable 调用委托给代表我的列表的 IQueryable 对象(感谢 AsQueryable)。谢谢你!
    【解决方案2】:

    可以用扩展方法吗

    .ToList<>
    

    【讨论】:

    • 我不知道如何使用它,因为我的查询将创建一个表达式(在 IQueryable 对象上的第一个 GetEnumerator 期间),我的 IQueryProvider 应该将该表达式转换为 IEnumerable 对象中的结果,至因为不是 ToList 方法。
    • 我真的希望我能提供更多帮助,但我无法提供帮助。
    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多