C1Olap は、コレクションをデータソースとして利用できます。これは、DataTable オブジェクトに限定されません。たとえば、LINQ で使用できます。
LINQ は、データをクエリーするための使いやすく、効率が高く、柔軟性のあるモデルを提供します。これを使用すると、開発者は、新しいストアドプロシージャを作成するなどの変更をデータベースに加えることなく、高度なクエリーをクライアントアプリケーションに組み込むことができます。一方、これらのクエリーを C1Olap のデータソースとして使用すると、エンドユーザーがデータの独自のビューを作成することができるようになります。
これを示すために、新しいプロジェクトを作成し、C1OlapPage コントロールをフォームに追加します。DataSource プロパティをデザイナで設定して以前実行したようなストアドプロシージャを使用する代わりに、今回は LINQ クエリーを使用してデータをロードします。これを行うために、次のコードをフォームのコンストラクタに追加します。
コード |
コードのコピー
|
---|---|
public Form1() { // デザイナ InitializeComponent(); // すべての対象テーブルを DataSet にロードします var ds = new DataSet(); foreach (string table in "Products,Categories,Employees," + "Customers,Orders,Order Details".Split(',')) { string sql = string.Format("select * from [{0}]", table); var da = new OleDbDataAdapter(sql, GetConnectionString()); da.Fill(ds, table); } // LINQ クエリーを作成し、それをデータソースとして、 // C1OlapPage コントロール用に使用します // … } // 標準の nwind mdb 接続文字列を取得します static string GetConnectionString() { string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\ComponentOne Samples\Common"; string conn = @"provider=microsoft.jet.oledb.4.0;" + @"data source={0}\c1nwind.mdb;"; return string.Format(conn, path); } |
コードは、NorthWind データベースから複数のテーブルをロードします。コードは、C1Olap セットアップで配置される "ComponentOne Samples" フォルダに NorthWind データベースがあることを前提としています。別の場所にデータベースがある場合は、それに合わせて GetConnectionString メソッドを調整する必要があります。
次に、実際の LINQ クエリーを追加します。これは長いクエリーですが、シンプルな文です。
コード |
コードのコピー
|
---|---|
// build LINQ クエリーを作成します var q = from detail in ds.Tables["Order Details"].AsEnumerable() join product in ds.Tables["Products"].AsEnumerable() on detail.Field<int>("ProductID") equals product.Field<int>("ProductID") join category in ds.Tables["Categories"].AsEnumerable() on product.Field<int>("CategoryID") equals category.Field<int>("CategoryID") join order in ds.Tables["Orders"].AsEnumerable() on detail.Field<int>("OrderID") equals order.Field<int>("OrderID") join customer in ds.Tables["Customers"].AsEnumerable() on order.Field<string>("CustomerID") equals customer.Field<string>("CustomerID") join employee in ds.Tables["Employees"].AsEnumerable() on order.Field<int>("EmployeeID") equals employee.Field<int>("EmployeeID") select new { Sales = (detail.Field<short>("Quantity") * (double)detail.Field<decimal>("UnitPrice")) * (1 - (double)detail.Field<float>("Discount")), OrderDate = order.Field<DateTime>("OrderDate"), Product = product.Field<string>("ProductName"), Customer = customer.Field<string>("CompanyName"), Country = customer.Field<string>("Country"), Employee = employee.Field<string>("FirstName") + " " + employee.Field<string>("LastName"), Category = category.Field<string>("CategoryName") }; // LINQ クエリーを C1OlapPage コントロールの DataSource として使用します c1OlapPage1.DataSource = q.ToList(); |
LINQ クエリーは、2つの部分に分割されます。最初の部分は、複数の join 文を使用して、データベースからロードしたテーブルを接続します。各テーブルは、既にクエリーで使用できるようになっているフィールドに主キーを結合することにより、クエリーに接続されます。[Order Details]テーブルから開始し、[ProductID]フィールドを使用して[Products]を結合し、次に[CategoryID]フィールドを使用して[Categories]を結合するというように、次々に結合します。
すべてのテーブルを結合したら、select new 文を使用して、対象のフィールドを含む新しい匿名クラスを作成します。フィールドは、テーブル内のフィールドに直接マップするか、または計算することができます。例にある[Sales]フィールドは、数量、単価、および値引きに基づいて計算されます。
LINQ クエリーが準備できたら、LINQ の ToList メソッドを使用して、これをリストに変換し、結果を DataSource プロパティに割り当てます。クエリーを実行するためには、ToList メソッドが必要です。クエリーをコントロールの DataSource プロパティに割り当てるだけで、構文エラーを取得できます。
プロジェクトを実行すると、以前にストアドプロシージャをデータソースとして使用したときと同様の外観と動作が得られます。LINQ を使用する利点は、クエリーがアプリケーションに組み込まれる点です。LINQ は、データベース管理者の手を借りることなく簡単に変更できます。