3

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

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

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

感谢您的答复,

一些精度

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

var result = from entry in MyRepository where 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
    }
4

2 回答 2

1

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

于 2009-02-02T13:50:50.107 回答
0

可以用扩展方法吗

.ToList<>
于 2009-02-02T13:35:02.680 回答