Asp.net Mvc 2: репозиторий, пейджинг и фильтрация как? - PullRequest
4 голосов
/ 22 марта 2010

Имеет смысл передать объект фильтра в хранилище, чтобы он мог ограничить возвращаемые записи:

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 Ответ

6 голосов
/ 22 марта 2010

Я реализую разбиение на страницы / сортировку на своем уровне обслуживания. Я думаю, что некоторые люди не согласятся с этим, но это прекрасно работает для меня. Убедитесь, что ваш репозиторий возвращает IQueryable.

<code>public class ProductService
{
   private IRepository<Product> Products {get; set;}</p>

<p>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 to NHibernate) и Linq2Sql.

...