0

私はページネーションのサポートを追加したいと言います。 私のアプリはWeb、サービス、リポジトリで分かれています。asp.net mvcでIQueryablesとlazyLoadingのヘルプ

コントローラはサービスと通信し、サービスはデータを取得し、ビジネスロジックを実行します。

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

その大丈夫です、私は私のContributorServiceでこのメソッドを持っている..私は、ページネーションのサポートをしたいと言います? OrderBy、Skip、Takeをリポジトリで実行する必要がありますか?現在、この

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

".ToList()"が指定されている場合のみクエリが実行されるため、 IQueryableで呼び出されるか、または、コラボレーションの最初の要素にアクセスされます。 LinqToSqlProfilerで確認できます。 –

答えて

0

は、私はあなたがそれの基本バージョン、および別のものを持っていることが、(私は、あなたがいずれかを持っていけないと思うあなたを行う)ビジネス・オブジェクトにクエリを追加するん

ページされたデータ。 ToListを呼び出すことによってそのクエリを実行するサービスが期待されますが、クエリオブジェクトをコントローラに返すのは危険です。

リポジトリには、並べ替え、開始、終了、およびフィルタparamsを持つ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(); 

     } 

リポジトリクラスをお持ちの場合は、このメソッドを追加できます。 ちなみに、私はDynamic LINQを使用しています。これは、式で式をプレーンテキスト(SQLと同じように)に簡単に渡します。