「サーバー側のフィルタ処理」の例は、C1DataSource により、Entity Framework をこれまでより簡単かつ便利にアプリケーションで使用できるようになったことを示しています。これは、C1DataSource の主要な機能であるクライアント側のデータキャッシュによって実現されました。また、いくつかの重要な機能が強化され、アプリケーションコードをはるかに容易に記述できるようになりました。
最初に、「サーバー側のフィルタ処理」の例で見ることができるパフォーマンスの向上について説明します。ユーザーがカテゴリを切り替えると、そのカテゴリに関連する製品がグリッドにロードされます。あるカテゴリを初めて選択すると、関連データが取得されるまでにわずかな遅延が発生します。その後、同じカテゴリを選択すると、データはほぼ即座に取得されます。なぜでしょうか。データが、サーバーからではなく、クライアントメモリのデータキャッシュ(EntityDataCache)から取得されるためです。
単一のマシンで作業し、ネットワークとのやり取りが必要ないなら、このパフォーマンスの向上は実感されないかもしれません。しかし、現実には、ユーザーアクションのたびにサーバーを呼び出すような反応が遅いアプリケーションと、遅延のない快適なインタフェースとの差は歴然です。
2つめの重要な改良点はメモリ管理です。これまでの説明や実際に目にしたことから、EntityDataCache は、存在する間ずっとデータを蓄積し続けているように思われるかもしれません。もしそうなら、すぐに深刻なパフォーマンスの低下を見ることになるはずです。実際の EntityDataCache は、保存されているデータを常に監視し、データが不要になるとそれを解放して、同時にセルフクレンジング処理を実行しています。これらの処理はすべて、何もコードを追加しなくても実行されます。また、さらに重要なことは、データの整合性が常に維持されるという点です。他のデータによって必要とされるデータは解放されません。また、何らかの変更が加えられたデータは、保存されるまで解放されません。この処理はパフォーマンスにも影響します。メモリ内の不要なオブジェクトを破棄すればパフォーマンスが向上し、反対に、古くなったデータがメモリに大量に保存されていればパフォーマンスが低下します。
C1DataSource では、クライアントキャッシュのお陰で複数のデータコンテキストを作成する必要がなくなり、コンテキスト管理がシンプルになったということを前に説明しました。ここでは、EntityDataCache の詳細と、その知識をさらに活用する方法について説明します。
EntityDataCache は本質的にコンテキストです。C1DataSource の名前空間において、キャッシュは C1.Data.Entities.EntityClientCache クラスであり、その ObjectContext プロパティを通して ObjectContext に1対1で対応します。C1DataSource コンポーネントを使用している場合は、キャッシュとその基底の ObjectContext がどちらも自動的に作成されます。ただし、必要な場合は、コードでこれらを明示的に作成し、C1DataSource.ClientCache プロパティを設定することができます。
クライアント側のキャッシュによってどのようにアプリケーションコードが簡略化されるかを見るために、変更データを保存する機能を Server-Side Filtering プロジェクトに追加してみます。
クライアント側のキャッシュは、ほかにもクライアント側のクエリーなどの C1DataSource の重要な機能を提供しています。特に、ライブビューは重要です。ライブビュー は、複雑なアプリケーションコードの大部分を単純なデータ連結に置き換えることができる機能です。これについては、後のセクションで説明します。