将过滤器对象传递给存储库是有意义的,因此它可以限制记录返回的内容:
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);
我假设存储库必须实现过滤,否则您将获得所有记录。
最佳答案
我在我的服务层实现分页/排序。我想有些人会不同意这一点,但这对我来说非常有用。不过,请确保您的存储库返回 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。
关于asp.net-mvc - Asp.net Mvc 2 : Repository, 分页和过滤如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2489750/