Как вы переносите выполнение выражения, созданного объектом IQueryable, в IEnumerable?

StackOverflow https://stackoverflow.com/questions/503208

Вопрос

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

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

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

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

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

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

var результат = из записи в моем каталоге, где запись.Продукт == "SomeProduct" выберите запись;

Что делает ToList или AsEnumerable, так это выполняет запрос и возвращает результат в виде списка или в виде IEnumerable.Но я должен реализовать интерфейс IQueryable в моем репозитории с помощью IQueryProvider, который преобразует выражение при вызове объекта IEnumerable.

Решение

Реализация решения заключается в делегировании вызова IQueryable моей коллекции inmemory с помощью 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
    }
Это было полезно?

Решение

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

Другие советы

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

.ToList<>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top