さまざまな状況で、データベースから提供されるテーブルやビューに直接対応していないカスタムビューを使用したいことがあります。LINQ は、このような状況に最適なツールです。柔軟、簡潔、かつ効率的なクエリーステートメントと任意の言語を使用して、生データを変換できます。Entity Framework DataSource(EF DataSource)では、LINQ クエリーステートメントを動的に実行できるので、LINQ の機能がさらに強力になります。このため、この LINQ 実装は LiveLinq と呼ばれます。LiveLinq の機能については、「ライブビュー|document=WordDocuments\C1DataStudio-WPF.docx;topic=Live Views」で説明します。ここでは、完全な更新可能性と連結可能性を損なうことなく、LINQ 演算子を使用して自由にビューを変更し、形成できるということだけを伝えておきます。
さっそく、LINQ 演算子の1つである Select("プロジェクション" とも呼ばれます)を使用して、ビューのフィールド(プロパティ)をカスタマイズしてみます。
ビューをカスタマイズするには、次の手順に従います。
Visual Basic |
コードのコピー
|
---|---|
dataGrid1.ItemsSource = _
(From p In c1DataSource1("Products").AsLive(Of Product)()
Select New With
{
p.ProductID,
p.ProductName,
p.CategoryID,
p.Category.CategoryName,
p.SupplierID,
.Supplier = p.Supplier.CompanyName,
p.UnitPrice,
p.QuantityPerUnit,
p.UnitsInStock,
p.UnitsOnOrder
}).AsDynamic()
|
C# |
コードのコピー
|
---|---|
dataGrid1.ItemsSource = (from p in c1DataSource1["Products"].AsLive<Product>() select new { p.ProductID, p.ProductName, p.CategoryID, CategoryName = p.Category.CategoryName, p.SupplierID, Supplier = p.Supplier.CompanyName, p.UnitPrice, p.QuantityPerUnit, p.UnitsInStock, p.UnitsOnOrder }).AsDynamic(); |
ここで、c1DataSource1["Products"] は1つの ClientCollectionView オブジェクトです。これは、デザイナで設定したビューソースに基づいて作成されるビューです(コードでビューソース自体にアクセスする必要がある場合は、c1DataSource.ViewSources["Products"] としてアクセスすることもできます)。AsLiveT_Method メソッド呼び出しは、ビューの項目タイプ(Product)を指定するために必要です。これにより、この項目に LiveLinq 演算子を適用できます。c1DataSource1["Products"].AsLive<Product>() の結果は1つの View<Product> です。C1.LiveLinq.LiveViews.View は、クライアント側ライブビューで使用される LiveLinq のメインクラスです。ライブビューに適用される LINQ 演算子は、ライブビューの更新可能性と連結可能性を維持します。これらは、通常と同じ LINQ 演算子ですが、ライブビューに適用されることで、データ連結アプリケーションに極めて重要な追加機能を提供します。
これで、この LiveLinq ビューの 'select' 句で定義した列がグリッドに表示されます。すべての列が変更可能であることにも注目してください。これは大したことに思えないかもしれませんが、ここで示すように行の追加や削除もサポートされる場合は特に、カスタマイズされたビューに独自に実装することが難しい重要な機能です。行の削除を試すには、行を選択し、Delete キーを押すだけです。行の追加を試すには、次のコードを実行するボタンをウィンドウに追加する必要があります。
Visual Basic |
コードのコピー
|
---|---|
Dim newItem = CType(dataGrid1.ItemsSource, System.ComponentModel.IEditableCollectionView).AddNew() dataGrid1.ScrollIntoView(dataGrid1.Rows.Count - 1, 0) |
C# |
コードのコピー
|
---|---|
object newItem =
((System.ComponentModel.IEditableCollectionView)dataGrid1.ItemsSource).AddNew();
dataGrid1.ScrollIntoView(newItem);
|
これが必要なのは、単に Microsoft WPF DataGrid には新しい行を追加するためのインタフェースが組み込まれていないためです。
連結可能性は、ビューが常に "ライブ" であり、静的データの単純なスナップショットではないことによって実現されます。これを証明するため、先ほどビルドしたフォームの正確な複製を構築します。この段階では、作成したフォームに簡単にアクセスできるように、アプリケーションにメニューを追加することも簡単でしょう。アプリケーションを保存、ビルド、および実行します。今回は、作成した2つのフォームインスタンスを開き、一方のフォームのグリッドでデータを変更します。もう一方のフォームのグリッドで、対応するデータが自動的に変更されることに注目してください。これらのフォームのグリッドに対して、行った変更を同期するためのコードを1行も記述していないことを思い出してください。
「ライブビュー|document=WordDocuments\C1DataStudio-WPF.docx;topic=Live Views」では、その他の LiveLinq の機能について確認します。