Как перенести выполнение выражения, созданного объектом IQueryable, в IEnumerable? - PullRequest
3 голосов
/ 02 февраля 2009

В моем коде я хотел бы сделать свои репозитории IQueryable. Таким образом, критериями выбора будет дерево выражений linq.

Теперь, если я хочу смоделировать свой репозиторий в теории, это очень просто: просто реализуйте интерфейс моего репозитория (который также является объектом IQueryable).

Моя импровизированная реализация репозитория была бы только в коллекции памяти, но мой вопрос таков: знаете ли вы простой способ реализовать интерфейс IQueryable моего макета, чтобы передать запрос в мою коллекцию в памяти (IEnumerable)? 1005 *

Спасибо за ваш ответ,

Некоторая точность

Клиентский объект моего хранилища будет использовать мое хранилище следующим образом:

var result = из записи в MyRepository, где entry.Product == «SomeProduct» выбрать запись;

Что ToList или AsEnumerable заключается в том, чтобы выполнить запрос и вернуть результат в виде списка или в виде 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
    }

Ответы [ 2 ]

1 голос
/ 02 февраля 2009

Используйте AsQueryable на ваших издевательствах. Теперь они могут быть опрошены, и вы можете обращаться с ними как с любыми другими.

0 голосов
/ 02 февраля 2009

Можете ли вы использовать метод расширения

.ToList<>
...