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

问题描述 投票:0回答:1

将过滤器对象传递到存储库是有意义的,这样它就可以限制返回的记录:

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);

我假设存储库必须实现过滤,否则你将获得所有记录。

asp.net-mvc pagination repository filtering
1个回答
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 to NHibernate)和Linq2Sql。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.