【问题标题】:Asp.net Mvc 2: Repository, Paging, and Filtering how to?Asp.net Mvc 2:存储库、分页和过滤如何?
【发布时间】:2010-03-22 11:16:01
【问题描述】:

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

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 repository paging filtering


    【解决方案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 to NHibernate)和Linq2Sql。

    【讨论】:

    • +1 为深思熟虑的答案。另外,即使您打算使用 IQueryable,我也建议您实际返回 IEnumerable,因为并非所有东西都支持 IQueryable。如果对象实例是 IQueryable,它仍然会受益于对 db 的延迟调用等,但您可以切换到 impl。不直接支持 IQueryable 无需更改任何依赖于接口的内容。
    • 您是否必须在条件上做一个大案例陈述以匹配 where 子句中的字段?
    • @Dr. Zim:实际上网上有几种动态排序实现。这是一个看起来不错的。 codeproject.com/KB/linq/Article.aspx?aid=27834 您也可以使用 C# 的内置表达式构建器来执行此操作,但它有点复杂。看起来你已经弄清楚了过滤。
    • 这里有一个更新,因为它仍然偶尔会得到支持。我或多或少地放弃了这种模式,转而将我的数据库直接插入我的控制器并在那里进行过滤、分页和排序。服务 + dtos + 存储库抽象对于我经常从事的各种项目来说太过分了。我的建议是考虑完成工作的最简单模式。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多