2016-03-21 6 views
-1

私はマイクロソフトによって与えられ、この例を見ていると私は完全に彼らが何をしようとしてのポイントを得る:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application巨大なデータセットでリポジトリパターンを効率的に実装する方法は? (ページングなど)

私の質問は:やったときにどのように効率的にこれを実装しますページングや膨大なデータセット(何百万以上のレコード)を扱うか?このコードを読んでいる方法では、GetStudentsをリポジトリから呼び出すたびに、データセット全体をリストすることができます。リポジトリで検索、並べ替え、ページングを効率的に実装するにはどうすればよいですか(アプリケーションではフィルタ/ページング/並べ替え操作を行うためにすべての行をクエリする必要はありません。私の特別なケースでは、私はEntity Frameworkについて話しています。以前は効率的なクエリにIQueryableを使用しましたが、リポジトリパターンを使用して効率的なストアクエリを生成する方法はありません。助けてください!

+0

フィルタは 'IQueryable'に適用された後にToList *を実行するので、フィルタリングされた結果セットだけがデータベースから返されます。 –

+0

データベースのデータセットをフィルタリング/ページするためにカスタムチューニングされたストアドプロシージャを作成すると、最高のパフォーマンスが得られる可能性があります。リポジトリ・パターンを使用することはできますが、EFを使用せずにデータベース・コールを自動生成するだけです。 – dbugger

+0

@GertArnold時々、フィルタリングされた結果セットはまだ100万レコードです:-) – Pugz

答えて

0

あなたが読んだ記事を読んでいるだけで、.ToList()を削除してください。それはIQueryableの魔女があなたのDBを「レイジーコール」して返すでしょう。

var students = from s in context.Students 
       select s; 

ポイントは次のとおりです:あなたが大規模なリポジトリを持っている場合、全部をクエリ決して単なる例として

はで述べています。常にWHERE基準を使用してください。 結果のページングは​​メモリ(アプリケーション)またはDBで行うことができます。それは本当にあなたの環境とニーズにかかっています。

+0

私はIQueryableを返すことができると認識しています...問題は、IQueryableはIQueryableデータ(たとえば、String.Join()などの演算を実行するC#関数で使用できないためです。ストア式(つまり、String.Join()はSQLサーバーによって理解されます)。また、IQueryableは技術的に実装されていない可能性のあるメソッドを公開しているため、漏れた抽象です。 – Pugz

0

あなたがフィルタリングで見ると、たとえばうにリンクされたページの下の方に見てみると:

public virtual IEnumerable<TEntity> Get(
     Expression<Func<TEntity, bool>> filter = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
     string includeProperties = "") 

Get関数は、ToListメソッドでクエリをマテリアライズする前にフィルタを適用します()。ページングを追加する場合は、使用するパラメータを追加して、マテリアライズする前に.Top()および.Skip()をクエリに適用できます。