如何将IQueryable对象创建的Expression的执行转移到IEnumerable?

时间:2009-02-02 13:27:43

标签: linq ienumerable expression iqueryable

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

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

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

感谢您的回复,

精确度

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

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

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

解决方案

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

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
    }

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用扩展方法

.ToList<>