Asp.net Mvc 2:存储库,分页和过滤如何?

时间:2010-03-22 02:46:07

标签: asp.net-mvc repository paging filtering

将过滤器对象传递给存储库是有意义的,因此它可以限制返回的记录:

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 个答案:

答案 0 :(得分:6)

我在服务层实现了分页/排序。我想有些人不同意这一点,但它对我来说很有用。确保您的存储库返回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。