DataSource for Entity Framework for WinForms
LiveLinq の概要
C1LiveLinq > LiveLinq の概要

LiveLinq は、関連する2つの方向で LINQ の機能を強化するクラスライブラリです。  

LiveLinq のスコープ

LiveLinq は、次の3種類の LINQ を実装します。

言い換えれば、LiveLinq のスコープはメモリ内の LINQ です。現在の LiveLinq バージョンは、データベースへの LINQ に対する代替機能を提供していません。しかし、これにより、データベースからメモリに取得されたデータで LiveLinq を使用できなくなるわけではありません。たとえば、ADO.NET を使用してデータベースからメモリ内のデータセットにデータを取得し、次に LiveLinq to DataSet を使用できます。また、LINQ to SQL または Entity Framework を使用してデータベースからオブジェクトを取得し、次に LiveLinq を使用してそのデータに対する操作を行い、Entity Framework または選択した別のフレームワークを使用して再度データベースに変更を送信することもできます。

LiveLinq と LINQ

LiveLinq は、標準の LINQ と同じ構文を持ちます。唯一変更が必要な点は、拡張メソッド AsIndexed()(インデックス用)または AsLive()(ライブビュー用)を適用してデータソースをラップすることです。

LiveLinq の2つの部分が互いに関連する方法

LiveLinq 機能の2つの領域であるインデックスとライブビューは、相互運用できますが、互いに独立しています。ライブビューを作成する必要がある場合にインデックスを定義する必要はありません。ビューは、クエリーを実行することによって最初にデータが挿入されます。したがって、インデックスを使用してクエリーを最適化できる場合は、ビューへのデータの挿入が高速化されます。ただし、最初の挿入後は、インデックスを明示的に定義する必要がない特別な最適化技術("インクリメンタルビューメンテナンス" と呼ばれる)を使用してビューが変更されます。

インデックスによる LINQ の高速化

LiveLinq には、クエリーパフォーマンスの最適化に使用されるインデックスフレームワークが含まれています(Silverlight では使用不可)。たとえば、次のように ProductID に基づくインデックスを定義することで、クエリーを劇的に高速化できます

from p in products where p.ProductID == 100

これは、1つの製品を検索するにも大きなコレクション全体を走査するのではなく、インデックスを使用して、要求された製品に直接アクセスできるようになるためです。

LINQ を使用しない場合でも、範囲検索などのさまざまな検索で、コード内のプログラムから同じインデックスを使用できます。

ライブビューを使用した宣言型プログラミング

ライブ(リアル)データ連結

LiveLinq は、LINQ にビューの概念を追加します。ビューは、クエリーの実行によって初期値が挿入された後もライブ状態を維持する、動的な結果セットを持つクエリーです。標準の LINQ クエリーは1つのスナップショットです。つまり、基底(ベース)のデータが変更されても結果リストは変化しません。したがって、完全な機能を備えたデータ連結には使用できません。ライブビューはベースデータと自動的に同期が維持されるため、LINQ クエリーへの完全なデータ連結が可能になります。

さらに、多くのビューがそれ自体更新可能です。ビュー内のオブジェクトのプロパティを変更したり、ビュー内で直接オブジェクトを追加および削除することができます。「更新可能なビュー」を参照してください。したがって、ビューは双方向に変更可能です。ベースデータの変更はビューに伝搬され、ビューの変更はベースデータに伝搬されます(後者は、通常の更新可能性の条件に従います)。

これは、完全な機能を備えた双方向のデータ連結です。

リアクティブ = "ビュー指向" = 宣言型プログラミング

主に GUI で使用されるデータ連結は、ライブビューの極めて重要な機能の1つですが、唯一の機能ではありません。より一般的には、ライブビューにより、"ビュー指向プログラミング" とも呼ばれる宣言型プログラミングが可能になります。また、非 GUI のバッチ処理コードも、ライブビューを使用して宣言型にすることができます。

実現技術:インクリメンタル性

ベースデータに変更が発生すると、ライブビューは、単に最初からデータを再挿入するのではなく、洗練された高速な方法で自分自身を更新します。この更新は、ローカルでインクリメンタルに行われ、ベースデータの差分からビューの差分が計算されます。ほとんどの場合は、ベースデータからビューに極めて高速に変更を伝搬できます。これは LiveLinq の重要な要素であり、"インクリメンタルビューメンテナンス" と呼ばれるコンピュータ科学の分野に基づく実現技術です。この最適化は、ユーザーには透過的に完全に水面下で実行され、ユーザーがそのために何かを行う必要はありません。