0

mvc プロジェクトで telerik mvc グリッドを使用しています。テーブルには約 100 万のレコードがあります。グリッドの読み込みに時間がかかりすぎています。

これは私のクエリです//

  var bib = (from a in db.Bibs
                   join inf in db.InfoTypes
                   on a.InfoTypeId equals inf.Id
                   where a.Status == "A"

                   select new BibViewModel
                   {
                       Id = a.Id,
                       Type = inf.Type,
                       InfoType = inf.Description,
                       Title = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "245" && asd.Sfld == "a" select asd.Value).FirstOrDefault(),
                       Author = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "100" && asd.Sfld == "a" select asd.Value).FirstOrDefault(),
                       CatalogueDate = a.CatalogDate,
                       Contents = "",
                       CreatedOn = a.CreatedOn,
                       ItemRelation = db.Items.Any(item => item.BibId == a.Id),
                       IssueRelation = db.Issues.Any(item => item.BibId == a.Id),

                   });


        return View(new GridModel(bib.OrderByDescending(x => x.CreatedOn).Tolist()));
4

1 に答える 1

0

ToList()実際にクエリを呼び出すため、呼び出しにToList()時間がかかりすぎる場合は、クエリに問題があることを意味します。

LINQでは、次の投稿のようにページングを使用できます。次のように、Skip and Takeを使用してXレコードをスキップし、Yレコードのみを取得するという考え方です。

var results = (from .. select ..).Skip(X).Take(Y)

1Mレコードの場合は、ストアドプロシージャに置き換えることを強くお勧めします。これにより、実行しようとしている処理がはるかに高速になります。カスタムページネーションアプローチを検討してください。これは、大きな結果セットで非常にうまく機能します。

ストアドプロシージャを使用できない場合は、これを読むと、ページ付けで何を実行する必要があるかを理解するのに役立ちます。LINQでは、生成されているSQLを調べて、SQLプロファイラーまたはLINQPadを使用してクエリを微調整できる場所を確認する必要があります。

于 2013-02-22T13:01:59.887 に答える