Я просто потратил некоторое время, чтобы узнать, как вернуть IQueryable из метода ... и мне все еще интересно, правильно ли это сделать.Возврат IQueryable <T> из моего метода? Правильно ли это?
Вот мой репозиторий класс:
public class CarRepository : ICarRepository
{
// Fake entities
private IList<Car> _entities = new List<Car>()
{
new Car() { Brand = "Lamborghini", Name = "Huracán"},
new Car() { Brand = "BMW", Name = "X6" }
};
// Allows deferred execution/further refinement
public IQueryable<Car> FindByQueryable(Expression<Func<Car, bool>> predicate)
{
var query = _entities.Where(predicate.Compile()).AsQueryable();
return query;
}
// Returning an IList or IEnumerable
public IList<Car> FindBy(Expression<Func<Car, bool>> predicate)
{
return _entities.Where(predicate.Compile()).ToList();
}
}
Сначала я подумал, что что-то подобное, что должно работать, но это не компиляции:
public IQueryable<Car> FindByQueryable(Expression<Func<Car, bool>> predicate)
{
var query = _entities.Where(predicate);
return query;
}
Правильно ли я с predicate.Compile () и .AsQueryable?
Спасибо вам за помощь! Bastien
Я бы скорее вернул 'IEnumerable' вместо 'IQueryable'. –
@AlexSikilinda IQueryable - [лучший выбор] (http://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet) для баз данных. Однако я не одобряю это в целом, я думаю, что репозиторий, который возвращает IQueryables, имеет низкое значение (возможно, просто используйте напрямую провайдер linq EF/LtSql и т. Д., И ваши абстракции будут течь во дворцах, которых вы не ожидаете (например, в в случае EF, ясно, какие данные отслеживаются?). –
Все в порядке. Оставьте ответственность за слой Dal, который будет взаимодействовать с репозиторием.В слое dal вы вызываете ToList, когда закончите построение полного запроса. – Legends