0

AJAX バインディングで Telerik Grid MVC を使用しています。

グリッドに IQueryable を提供すれば、ページング/ソート/フィルタリングはデータベース サーバーで行われるのではないかと考えました。そのようです:

[GridAction]
public ActionResult Select()
{
    return View(new GridModel(Mapper.Map<IEnumerable<DokumentVM>>(db.Dokumenti)));        
}

データベースに約 10000 ドキュメントのテスト データを作成し、上位のコマンドによって、それぞれがグリッドに運ばれました。そして明らかに、それは永遠にかかります。

グリッドは、次のように AJAX 経由でバインドされます。

@(Html.Telerik().Grid<ViewModels.DokumentVM>()
.DataBinding(b => b.Ajax().Select("Select", "Dokument"))
.Pageable(p => p.PageSize(20))
.Sortable(s => s.SortMode(GridSortMode.MultipleColumn).OrderBy(m => { m.Add("Date").Descending(); m.Add("Number").Descending(); })))

Select ActionMethod 内で Request (そのフォーム) を調べると、グリッドが適切に機能するために必要なすべての情報を送信していることがわかります。

page:     1
size:     20
orderBy:  Date-desc~Number-desc

しかし、データベースに送信された SQL コマンドをさらに調べると、SELECT コマンドのみが存在し、WHERE も ORDER by も何もないことがわかり、すべてのデータが失われます。

ページング/ソート/フィルタリングが自動的に機能する可能性があるかどうか、またはグリッドから送信された情報を自分で SQL コマンドに変換する必要があるかどうか疑問に思っています。必要なのは IQueryable を提供することだけであり、残りは Grid が行うという印象を受けました。しかし、それは私にはうまくいきません。

たぶん私は何か間違ったことをしているのですか、それともこれは不可能ですか?

4

1 に答える 1

1

問題は AutoMapper の使用です! この行を呼び出すと:

 return View(new GridModel(Mapper.Map<IEnumerable<DokumentVM>>(db.Dokumenti)));

最初に、AutoMapper はすべてのdb.Dokumenti行をメモリ関数内の新しい形式に変換しようとします。その後、マッピングされたデータが GridModel に渡されます。ページングと順序付けに関するすべてのことは、このクラス内で行われます。

したがって、このレベルで AutoMapper を使用したり、別の戦略を使用したりすることは避けてください。たとえば、次のようなクエリを作成できます。

var q= from r in db.Dokumenti select new DokumentVM(){ ... }

q次に、変数をGridModelクラスに渡します。

于 2012-10-12T16:09:31.410 に答える