0

说我想添加分页支持。 我的应用程序在Web,服务和存储库中分开。帮助IQueryables和lazyLoading在asp.net mvc

控制器只与服务对话,服务获取数据并执行业务逻辑。

说我要支持分页..我有这个方法在我ContributorService

public IQueryable<Contributor> GetContributors(int page, int pageSize) 
     { 
      return _repository.GetAll().OrderBy(c=>c.ACC_CREATEDATE).Skip((page)*pageSize).Take(pageSize);//solo temporalmente 
     } 

是OK?还是应该在存储库中完成OrderBy,Skip,Take?

目前唯一做到这一点

public IQueryable<Contributor> GetAll() 
     { 
      return db.Contributors; 
     } 
+3

无论哪种方式,它没有区别,因为只有当“.ToList()”在IQueryable上调用,或者访问集合中的第一个元素。可以通过LinqToSqlProfiler进行确认。 – 2011-02-07 04:48:38

回答

0

我想查询添加到业务对象(我想你没有一个,你),但你可能有它的基础版本,另一个为分页数据。并期望服务通过调用ToList来执行该查询,我发现将查询对象返回给控制器是危险的。

您的存储库可能有一个GetPartial方法,包括排序,从,到和过滤参数。如果你有一个通用服务,你也可以在这个通用服务中实现它。

public List<Contributor> GetPartial<TSortBy>(Expression<Func<Contributor, TSortBy>> sortByExpr, Expression<Func<Contributor, bool>> filterExpr, int pageNo, int pageSize) 
     { 
      var query = db.Contributors; 
      if (filterExpr != null) 
        query.Where(filterExpr); 
query.orderBy(sortByExpr).Skip (...).Take(...).ToList(); 

     } 

如果您有一个存储库类,则可以添加此方法。 顺便说一句,我使用的动态LINQ,这使得它更容易通过表达式传递顺序作为纯文本(就像sql)