如何将由IQueryable对象创建的Expression的执行转移到IEnumerable? [英] How do you transfer the execution of a Expression created by an IQueryable object to a IEnumerable?

查看:103
本文介绍了如何将由IQueryable对象创建的Expression的执行转移到IEnumerable?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的代码中,我想将我的存储库设置为IQueryable.这样,选择的标准将是linq表达式树.

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

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

感谢您的回复,

精确度

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

var result =从MyRepository中的条目,其中entry.Product =="SomeProduct"选择条目;

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
    }

解决方案

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

In my code I'd like to make my repositories IQueryable. This way, the criteria for selection will be a linq expression tree.

Now if I want to mock my repository in theorie this is very easy : just implement the interface of my repository (which is also a IQueryable object).

My mock repository implementation would be only a in memory collection, but my question is : Do you know an easy way to implement the IQueryable interface of my mock, to transfer the query to my in-memory collection (IEnumerable) ?

Thanks for your response,

Some precision

The client object of my repository will use my repository this way :

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

What does ToList or AsEnumerable is to execute the query and return the result as a List or as a IEnumerable. But I have to implement the IQueryable interface on my repository, with a IQueryProvider which transform the expression in a call to a IEnumerable object.

Solution

The implementation of the solution is delegating call to IQueryable to my inmemory collection with 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
    }

解决方案

Use AsQueryable on your mocks. Now they're queryable and you can treat them like any other queryable.

这篇关于如何将由IQueryable对象创建的Expression的执行转移到IEnumerable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆