Как вы переносите выполнение выражения, созданного объектом IQueryable, в IEnumerable?
-
20-08-2019 - |
Вопрос
В моем коде я хотел бы сделать мои репозитории доступными для 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<>