Linq 如何将IQueryable对象创建的表达式的执行转移到IEnumerable?

Linq 如何将IQueryable对象创建的表达式的执行转移到IEnumerable?,linq,ienumerable,expression,iqueryable,Linq,Ienumerable,Expression,Iqueryable,在我的代码中,我想使我的存储库变得易读。这样,选择的标准将是linq表达式树 现在,如果我想在理论上模拟我的存储库,这非常简单:只需实现我的存储库的接口,它也是一个IQueryable对象 我的模拟存储库实现将只是一个内存集合,但我的问题是:您知道一种实现我的模拟的IQueryable接口的简单方法吗?将查询传输到我的内存集合IEnumerable 谢谢你的回复 有些精确 我的存储库的客户端对象将以以下方式使用我的存储库: var result=来自MyRepository中的条目,其中entr

在我的代码中,我想使我的存储库变得易读。这样,选择的标准将是linq表达式树

现在,如果我想在理论上模拟我的存储库,这非常简单:只需实现我的存储库的接口,它也是一个IQueryable对象

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

谢谢你的回复

有些精确

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

var result=来自MyRepository中的条目,其中entry.Product==SomeProduct选择条目

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

解决方案

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

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
    }

你能使用扩展方法吗

.ToList<>

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

我不知道如何使用它,因为我的查询将在IQueryable对象上的第一个GetEnumerator期间创建一个表达式,并且我的IQueryProvider应将该表达式转换为IEnumerable对象,并将其转换为结果,wich不是ToList方法。我真的希望我能提供更多帮助,但我无法提供帮助。在此之前,如果我理解你的意思,我不能做任何客户打电话询问我的存储库,但多亏了你,我找到了一个好的解决方案!我只需要将我的存储库的IQueryable调用委托给IQueryable对象,该对象表示我的列表,这要感谢AsQueryable。谢谢你!