このデモは、ライブビューを使用して、手続き型コードをほとんど記述することなく、ほぼ完全に宣言型のクエリー/ビューおよびデータ連結に基づいて GUI アプリケーション全体を構築する方法を示します。このデモには、ライブビューを(通常は)サーバー側の非 GUI バッチ処理で使用する例も含まれます。
これは、シェイクスピア劇を上演する架空の会社のモックアップ課題追跡アプリケーションです。このデモには3つのバリエーションがあり、それぞれコレクション(LiveLinq to Objects を使用)、ADO.NET(LiveLinq to DataSet を使用)、XML(LiveLinq to XML を使用)という異なるデータストアの上に構築されています。このデモでは、WinForms データ連結を使用しますが、代わりに WPF データ連結を使用することもできます。どちらの場合も、ライブビューはまったく同じになります。
データスキーマには Products が含まれます(製品とはシェイクスピア劇の演目)。各製品には機能(劇中の役)が含まれます。また、課題(特定のシーンでのまずい演技など)を表す Issues があります。さらに、これらの課題が割り当てられる Employees(従業員とは役を演ずる役者)、およびこのスキーマの重要な部分として Assignments があります。どの従業員にも、それぞれ引き受けるべきいくつかの機能が割り当てられます。この割り当てには重複もあります。つまり、1つの機能に複数の従業員を割り当てることができます。
アプリケーションを起動し、Assigned Issues フォームを開くと、特定の従業員に割り当てられている課題を表示できます。課題を表すビューは次のようになります(ここでは、ビューの LiveLinq to DataSet バージョンを示します。Objects バージョンと XML バージョンも同様です)。
コードのコピー
|
|
---|---|
from i in _dataSet.Issues.AsLive() join p in _dataSet.Products.AsLive() on i.ProductID equals p.ProductID join f in _dataSet.Features.AsLive() on new { i.ProductID, i.FeatureID } equals new { f.ProductID, f.FeatureID } join e in _dataSet.Employees.AsLive() on i.AssignedTo equals e.EmployeeID where i.AssignedTo == employeeID select new Issue { IssueID = i.IssueID, ProductName = p.ProductName, FeatureName = f.FeatureName, Description = i.Description, AssignedTo = e.FullName }; |
これは、いくつかの結合とフィルタ処理を使用した複雑な LINQ クエリーです。このデモは、このクエリーがライブで動的であること、データの変更に対して自動的に反応すること、それに DataGridView などの GUI コントロールを連結できることを示しています。
たとえば、Add Issue フォームで課題を1つ追加し、それを Assigned Issues フォームに表示されている従業員に割り当てると、その従業員の課題リストが自動的に更新され、新しく作成された課題が表示されます。
Assigned Issues フォームでは、Immediate と Deferred のメンテナンスモードの違いも示します。これらのモードは、2つのラジオボタンを使用して切り替えることができます。Deferred モード(オンデマンドで更新)に切り替えて、課題を追加した場合は、変更がビューにすぐに反映されません。たとえば、従業員を変更してから元の従業員に戻した場合のように、ビューからデータを要求した場合にのみ反映されます。
基本的に同じビューを使用する (Re)assign Issue フォームもあります。コードを記述せずに、ライブビューとデータ連結だけを使用して、課題の割り当てや再割り当てを行うことができます。
Assigned Issues フォームと (Re)assign Issue フォームは、任意の数のインスタンスを並べて開くことができます。このようにいくつかのフォームを開き、フォームの1つで課題を再割り当てして、その変更が他のすべてのフォームに自動的に反映されることを実際に試すことができます。
このデモは、さらに複雑なアクションもいくつか示しています。たとえば、ライブビューで一度に複数の行を変更する方法です。All Issues Concerning an Employee という名前のフォームは、次のビューを使用して、特定の従業員に割り当てられたすべての機能のすべて課題を示します。
コードのコピー
|
|
---|---|
from a in _dataSet.Assignments.AsLive() join p in _dataSet.Products.AsLive() on a.ProductID equals p.ProductID join f in _dataSet.Features.AsLive() on new { a.ProductID, a.FeatureID } equals new { f.ProductID, f.FeatureID } join i in _dataSet.Issues.AsLive() on new { a.ProductID, a.FeatureID } equals new { i.ProductID, i.FeatureID } join e in _dataSet.Employees.AsLive() on i.AssignedTo equals e.EmployeeID where a.EmployeeID == employeeID select new Issue { IssueID = i.IssueID, ProductName = p.ProductName, FeatureName = f.FeatureName, Description = i.Description, AssignedTo = e.FullName }; |
従業員への機能の割り当ては、(Re)assign Features フォームで変更できます。従業員に割り当てられた機能セットを変更して、その変更が、ときにはかなり大規模に、All Issues Concerning an Employee フォームでどのように自動的に行われるかを実際に確認することができます。(現実のアプリケーションではよくあることですが、数千の課題を追加しない限り)このような小規模なデータセットで確認することは容易ではありませんが、ビューで変更を行うと、LiveLinq に実装されたインクリメンタルビューメンテナンスのおかげで、ビューの再クエリーやグリッド全体のリフレッシュによる遅延なく、変更内容がすばやくグリッドに表示されます。
このデモは、他のビューに基づいてビューを作成する方法やビューにインデックスを作成する方法(「ライブビュー:他のビューに基づいてビューを作成し、ビューにインデックスを作成する方法」を参照)、およびライブビューを使用して、手続き型コードではなく宣言型ルールセットとして非 GUI アプリケーションを作成する方法(「ライブビュー:ライブビューを使用して、手続き型コードではなく宣言型ルールセットとして非 GUI アプリケーションを作成する方法」)も示します。