Asp.net Mvc 2: репозиторий, подкачка и фильтрация как сделать?
Имеет смысл передать объект фильтра в репозиторий, чтобы он мог ограничить, какие записи возвращаются:
var myFilterObject = myFilterFactory.GetBlank();
myFilterObject.AddFilter( new Filter { "transmission", "eq", "Automatic"} );
var myCars = myRepository.GetCars(myfilterObject);
Ключевой вопрос: как бы вы реализовали пейджинг и где? Есть ли ссылки на то, как вернуть LazyList из репозитория, как это будет применяться здесь? Будет ли это частью объекта фильтра? Что-то вроде:
myFilterObject.AddFilter( new Filter { "StartAtRecord", "eq", "45"} );
myFilterObject.AddFilter( new Filter { "GetQuantity", "eq", "15"} );
var myCars = myRepository.GetCars(myfilterObject);
Я предполагаю, что репозиторий должен реализовать фильтрацию, иначе вы получите все записи.
1 ответ:
Я реализую подкачку/сортировку в своем сервисном слое. Я думаю, что некоторые люди не согласятся с этим, но это отлично работает для меня. Убедитесь, что ваш репозиторий возвращает IQueryable, хотя.
public class ProductService { private IRepository<Product> Products {get; set;}
Public IEnumerable<ProductDto> GetProductsMatching(FilterCriteria criteria) { var products = Products.Query() .Where( // do filtering ) .OrderBy( // order by ) .Skip(criteria.PageSize * criteria.CurrentPage) .Take(criteria.PageSize); var dtos = products.Select( // do mapping ); return dtos; } }
Способ возврата LazyList/IQueryable зависит от того, какой ORM вы используете. Я знаком только с NHibernate (используйте Linq для NHibernate) и Linq2Sql.