DataSource for Entity Framework for WPF/Silverlight
大規模なデータセット:仮想モード
DataSource for Entity Framework > 大規模なデータセット:仮想モード

大規模なデータセット:ページング|document=WordDocuments\C1DataStudio-WPF.docx;topic=Large Datasets\: Paging」で説明したように、Entity Framework DataSourceEF DataSource)には、大規模なデータや大量の行を処理するためのソリューションとして、ページングよりはるかに優れた機能があります。

数千から数百万もの行を持つ大規模なデータセットを問題なく使用できるとしたらどうでしょうか。ページングを使用せず、コードを変更することもなく、1つのブール値プロパティを設定するだけで、データセットが小規模な場合と同じコントロールを使用して巨大なデータセットを表示できるとしたらどうでしょうか。EF DataSource は、魔法のような VirtualMode プロパティによってこれを実現します。

仮想モードを実装するには、次の手順に従います。

  1. 大規模なデータセット:ページング|document=WordDocuments\C1DataStudio-WPF.docx;topic=Large Datasets\: Paging」の説明で作成したプロジェクトを使用します。前と同様に、同じ ObjectContextType を使用して、C1DataSource コンポーネントを含む新しいフォームを追加します。このフォームをスタートアップフォームにすることで、プロジェクトの実行にかかる時間を短縮することができます。
  2. ViewSourceCollection エディタで ViewSource を作成します。サンプルデータベースの最大のテーブル Order_Details を使用します。
  3. VirtualMode プロパティを Managed に設定します。もう1つの値として Unmanaged がありますが、これは使用時に注意が必要な高度なオプションです。必要な場合にのみ使用してください。Managed オプションを設定すると、サーバーからのデータ取得がグリッドコントロールによって管理されます。Managed オプションを使用して、EF DataSource は、すべての主要な Microsoft および ComponentOne グリッドコントロール(C1FlexGrid、C1DataGrid、および Microsoft DataGrid for WPF)をサポートします。EF DataSource のパフォーマンスは、これらのグリッドコントロールについて最適化されています。Unmanaged オプションに設定した場合、仮想モードは特定のコントロールに基づいて動作するのではなく、任意の連結コントロールと共に動作しますが、こちら|document=WordDocuments\C1DataStudio-ProgrammingGuide.docx;topic=Unmanaged virtual mode limitationsで説明されているように、いくつかの制限が適用されます。
  1. デザイナにグリッドを追加し、前と同じ方法でそれを Order_Details に連結します。

ItemsSource="{Binding ElementName=c1DataSource1, Path=Order_Details}"

  1. XAML でグリッドの AutoGenerateColumns プロパティを True に設定します。

Managed オプションを選択したので、データを操作するグリッドコントロールを指定する必要があります。EF DataSource は、添付プロパティ C1DataSource.ControlHandler|tag=P_C1_WPF_Data_Entities_C1DataSource_ControlHandler を定義します。これは、C1DataSource|keyword=C1DataSource クラス に連結されるとコントロールの動作に影響を及ぼすプロパティを持つオブジェクトです。C1DataSource.ControlHandler|tag=P_C1_WPF_Data_Entities_C1DataSource_ControlHandler には、VirtualMode ブール値プロパティがあります。このプロパティは、このコントロールを Managed 仮想モードのメインの "制御中" コントロールとしてマークします。

  1. XAML で DataGrid マークアップ内に次のマークアップを追加します(追加されたマークアップは影付きで示します)。
    XAML
    コードのコピー
    <DataGrid AutoGenerateColumns="True"  Name="dataGrid1"
           ItemsSource="{Binding ElementName=c1DataSource1, Path=Order_Details}">
                <c1:C1DataSource.ControHandler>
                      <c1:ControlHandler VirtualMode="True"/>
                </c1:C1DataSource.ControHandler>
          </DataGrid>
    
  2. アプリケーションを保存、ビルド、および実行します。

これほど優れたグリッドはほかにありません。このグリッドで、適切に移動およびスクロールしたり、行データを変更することができます。外観も動作も従来のデータグリッドと同様で、それがまさに重要な点です。難点の多いページングもコードの記述もまったくなく、大規模なデータセットを使用できるようになりました。さらに、DataSource プロパティを持つ任意の GUI コントロールを使用できるという利点があります。この例では、比較的小さなサイズのデータセットを使用しましたが、仮想モードで実行される C1DataSource は、はるかに大きなデータセットでも同様に応答します。その動作が行数に左右されることはありません。その点について確認するために、製品と共にインストールされている OrdersDemo サンプルを見てみます。このサンプルでは、より大きなデータベースが使用されており、その行数は、この例で使用されているデータセットより約 65,000 行多くなっています。ただし、応答速度はどちらも変わりません。このように、C1DataSource の動作は、データセットの行数に左右されません。

なぜ、このようなことが可能なのでしょうか。その動作はページングとかなり似ていますが、内部的な動作は GUI コントロールからは見えず、隠れて行われているページングと言えます。GUI コントロールには、データがクライアントにフェッチされ、使用する準備ができているかのように示されます。GUI コントロールがデータを要求すると、C1DataSource または ClientViewSourceC1DataSource コントロールがなく、コードで ClientViewSource が使用されている場合)は、メモリから、つまりすべての機能に使用されているクライアント側のキャッシュから、データを取得して提供できるかどうかを最初に確認します。メモリにデータが見つからない場合は、要求されたデータをサーバーから透過的にフェッチします。クライアント側のキャッシュを使用する他の機能と同様に、C1DataSource は、フェッチしたデータを無制限には保存しません。無制限に保存すると、メモリリークになってしまいます。C1DataSource は、GUI コントロールに提供する必要があるデータを認識しています。変更されたり、変更された部分に関係するために、保存しておく必要があるデータも認識しています。また、不要になった古いデータを必要に応じて解放します。コードを記述する必要はなく、任意の GUI コントロールを使用できます。