2012-01-25 15 views
1

具体的に設計されたビューでレンダリングされるDXグリッドビューがあります。 Linq-2-Entitiesクエリからの値が埋め込まれた、あらかじめ定義されたViewModelオブジェクトを渡します。問題は、私たちのコールバック関数では、フィルタリング、ソート、およびページングがDevExpressグリッドによって実行される前に、L2Eクエリが実際にDB上で実行されるということです。 IE:データはビューに渡された前に、クエリが実際に実行される。このような状況でDevExpress MVC Gridview + LINQ

public ActionResult GridViewPartial(string myParameters) 
{ 
    var modelData = from s in db.myTable 
            select new { modelName = s.Name }; 

    return PartialView("GridViewPartial", modelData); 
} 

(簡略化した例では、実際の状況では、我々はいくつかのテーブルから、まだ単一LINQクエリでデータを選択します)。したがって、実際にはDBからのデータの量が多すぎますが、グリッドビューでは選択したページのみが表示されます。

ユーザーが選択したページのデータのみを選択するように、クエリを変更する必要はありますか? IE。前述の状況のように、100000行(表にその数が多い場合)を選択するのではなく、その後にフィルタリング/並べ替え/ページングを適用するのではなく、ユーザーがページ2を選択したときに10行をスキップしてL2Eクエリを10回使用しますか?

答えて

4

MVC GridViewの拡張はとてもサポートしています「server mode」は機能的には内部のLinqServerModeDataSourceオブジェクトを介して呼び出されます。

それは、データソースとしてのIQueryableオブジェクトを必要とします。

直接LINQクエリ:LinqToX DataCotnext /クラスから

http://www.devexpress.com/issue=Q333116

@Html.DevExpress().GridView(...).BindToLINQ(string.Emptry, string.Emptry, (s, e) => { e.KeyExpression = Key_Column_Here; e.QueryableSource = Linq_Query_Here; } 

表/ビュー。

http://mvc.devexpress.com/GridView/DataBindingToLargeDatabase

@Html.DevExpress().GridView(...).BindToLINQ(Data_Context_Name_Here, Table_View_Name_Here).GetHtml() 
+0

投稿した最初のURL、http://www.devexpress.com/issue=Q333116には、ページング/並べ替え/フィルタリングパラメータを使用するLINQクエリを生成するために独自のロジックを実際に使用するように見えるサンプルプロジェクトが含まれています。 "ベース"のlinqクエリ(IQueryable myLinqObject = dbContext.myTableのsから)を作成し、データベース側でクエリを実行する前にgridviewにこれらのパラメータを自動的に追加することはできませんか?可能であれば、私は自分自身のロジックを実装することを避けたいと思います.BindToLINQ()関数はTake、Skipなどのアクションを単独で追加すると仮定しました。 – L2Eer

+0

絶対に。 BindToLINQメソッドを使用している場合(どちらの方法でも)、GridViewは対応するLINQコマンド(Take、Skipなど)を実行します。 です。つまり、手動で実行する必要はありません。 あなたが提供したコードを使用して、SQL Server Profilerで必要なクエリを確認してください。 – Mikhail

1

データアクセス層/レベルでページング/ソート/フィルタリングを実装し、表示する必要があるものだけを返します。グリッドは正しいページを表示できますが、クライアント側で発生し、常にすべてがロードされるためですあなたがXPO ORMを使用してグリッドサーバモードを有効にする場合を除いて(少なくともこれはWindowsフォームとASP.NETグリッドのコンセプトです)、データベースから削除してください。

あなたの質問に対する答えは、パラメータページサイズとページインデックスとして受け入れるようにLINQクエリを設計し、必要な特定のpageIndexからTake(pageSize)を実行する必要があるということです。これらのすべては、db上のストアドプロシージャで直接行うこともできます。

+0

私は似たようなことを考えていましたが、あなたができるように渡されたコレクションのみを保持しながら、100ページの最大があります、それを伝える例えばとしてDXのページングパラメータに影響する場合、私は気づいていませんよ10個のオブジェクト。クライアント側のDX Gridviewコンポーネントは、並べ替える列などの読み取り可能なパラメータも渡しますか?もっと重要なのは、このソリューションは、DXのGridviewコンポーネントを無意味に使用するのではないということですか? – L2Eer

3

DevExpressのグリッドビューがLinq DBコマンドを効果的に使用するためには、オブジェクトタイプがSystem.Linq.IQueryableである必要があります。お使いのコントローラの内部では、あなたのロジックを構築し、ビューにあなたのLINQクエリを渡す:かみそりビュー内

System.Linq.IQueryable modelData = from s in db.myTable 
           select new { modelName = s.Name }; 

return PartialView("GridViewPartial", modelData); 

、コマンドでGridViewのを開始:

@model System.Linq.IQueryable 
@Html.DevExpress().GridView(...).BindToLINQ((string)null, null, (s, e) => { e.KeyExpression = "Table_id"; e.QueryableSource = Model;}) 
関連する問題