2016-08-26 19 views
1

MVCで大量のデータ(DBは2-300万レコード)にページング、検索、ソートを実装したいと思います。 MVCで(PagedList.Mvc@Html.PagedListPagerを使用して)デフォルトのページングオプションを使用している間は、すべてのレコードがDB &のためにフェッチされ、100レコードのみがページに表示されます。それは多くのメモリを使用して時間がかかる&です。MVCでカスタムロジックを使用して大量のデータをページングする

MVCでカスタムロジックを実装すると、1ページあたり100個のレコードしか取得できないのですか?現在私は両方のアプローチ(EFとSPを使用して)を試みています。

私は既にEF & SPを使用してサンプルアプリケーションを開発し、デフォルトのページングを実装しています。しかし、どちらの方法もDBからすべてのレコードを取得し、クライアント側でページングを適用します。それはあまりにも時間がかかります。

public ActionResult Index(int? page) { 
     return View(db.TestUploadData2.ToList().ToPagedList(page ?? 1, 100)); 
} 

お勧めはありますか?

+0

EFクエリも共有できますか? – Sampath

+0

日付選択を使用してデータを表示することはできませんか?一度に多くのデータを表示する目的は何ですか? – Sampath

+0

'PagedList.Mvc'を使うと、' .Skip() 'と' .Take'を使って 'IQueryable 'を返します。ページサイズが100の場合は100レコードをメモリに返します –

答えて

1

あなたが実行している問題は、データベースからC#メモリにすべてを引き出し、、次にを表示することだけです。

db.TestUploadData2.ToList().ToList()はデータベースから取得するものなので、前もって資格を付けたいと思っています。このような

何かがあなたが何をする必要があるかのようになります。ここでは

public IEnumerable<TestUploadData2> GetPagedData(string prop1SearchValue, 
               string prop2SearchValue, 
               int pageNum = 1, 
               int pageSize = 20) 
{ 
    var data = db.TestUploadData2; 

    // No idea what your properties are, so I'll just wing with strings. 
    if (!string.IsNullOrWhitespace(prop1SearchValue)) 
    { 
     data = data.Where(d => d.Prop1 == prop1SearchValue); 
    } 

    // Did it like this so you can see how to conditionally filter the query 
    if (!string.IsNullOrWhitespace(prop2SearchValue)) 
    {  
     data = data.Where(d => d.Prop2 == prop2SearchValue); 
    } 

       // If it is the first page, then 0 * pageSize, 
       // second page, skip 1 * pageSize, etc. 
    return data.Skip((pageNum - 1) * pageSize) 
       // Take only what is being asked for. 
       .Take(pageSize) 
       // NOW pull it from the database. 
       .ToList(); 
} 
+1

おかげさまで、コードを共有してくれてありがとうございます。 ToList()に関するあなたのコメントは私にとって非常に有用であることがわかります。私は私の問題を解決しました。 ありがとうございました..... –

+1

これまたは任意の回答があなたを助けた場合。あなたの質問に出会う他の人に、彼らをアップアップして、あなたを最も助けてくれた人を受け入れるようにしてください。 – krillgar

+0

しかし私の問題はSkip()とTake()です。これらの関数は、データが小さい場合は正常に動作しています。作業500000がこれらの機能を記録すると、レコードの表示がわずか10行である間にメモリスタックから例外が発生するか例外がスローされます。 –

2

PagedList.Mvcを使用する正しい方法です。

public ViewResult Index(int? page) 
{ 
    int pageSize = 100; 
    int pageNumber = (page ?? 1); 
    return View(db.TestUploadData2.ToPagedList(pageNumber, pageSize)); 
} 

詳しくは、Paging with the Entity Frameworkの記事を参照してください。

関連する問題