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 4

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.