FlexPivot for WinForms
LINQ を FlexPivot のデータソースとして使用
タスク別ヘルプ > LINQ を FlexPivot のデータソースとして使用

FlexPivot は、DataTable オブジェクトに制限されず、任意のコレクションをデータソースとして使用できます。また、LINQ をデータソースとして使用することもできます。LINQ は、柔軟で効率的なデータクエリーモデルです。LINQ を使用すると、データベースを変更することなく、クライアントアプリケーションで新しいクエリーを作成できます。FlexPivot コントロールの場合は、これらのクエリーを C1FlexPivot のデータソースとして使用できるため、エンドユーザーが独自のデータビューを作成できます。LINQ は、作成したクエリーをアプリケーションに格納するため、ユーザーはデータベース管理者の助けを借りることなくクエリーを変更できます。

FlexPivot アプリケーションで LINQ クエリーをデータソースとして実装するには、次の手順を実行します。

  1. Visual Studio で新しい Windows フォームアプリケーションプロジェクトを作成します。
  2. FlexPivotPage コントロールをフォームにドラッグアンドドロップします。
  3. コードビューに切り替えて、次の名前空間を追加します。
    Imports System.Data.OleDb
    Imports System.Linq
    
    using System.Data.OleDb;
    using System.Linq;
    
  4. Form1.cs ファイルのコンストラクタに次のコードを追加し、LINQ クエリーを使用してデータをロードします。
    Dim ds = New DataSet()
    For Each table As String In "Products,Categories,Employees,Customers,Orders,Order Details".Split(","c)
        Dim sql As String = String.Format("select * from [{0}]", table)
        Dim da = New OleDbDataAdapter(sql, GetConnectionString())
        da.Fill(ds, table)
    Next table
    
    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);
    }
    
  5. システムにインストールしたデータベースへの接続を作成するために、接続文字列を初期化します。この例では、 Nwind_ja.mdbファイルをデータベースとして使用します。このファイルは、システムの Documents\ComponentOne Samples\Common\C1NWind.mdb にあります。このデータベースファイルが別の場所に保存されている場合は、GetConnectionString メソッドで定義されているパスを変更します。
    Private Shared Function GetConnectionString() As String
        Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) 
        & "\ComponentOne Samples\Common"
        Dim conn As String = "provider=microsoft.jet.oledb.4.0;data source={0}\Nwind_ja.mdb;"
        Return String.Format(conn, path)
    End Function
    
    static string GetConnectionString()
    {
        string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\ComponentOne Samples\Common";
        string conn = @"provider=microsoft.jet.oledb.4.0;data source={0}\Nwind_ja.mdb;";
        return string.Format(conn, path);
    }
    
  6. 次の LINQ クエリーを追加して、データベースファイルからロードしたテーブルに FlexPivotPage コントロールを接続します。
    Dim q = From detail In ds.Tables("Order Details").AsEnumerable() _
            Join product In ds.Tables("Products").AsEnumerable() On detail.Field(Of Integer)("ProductID") 
            Equals product.Field(Of Integer)("ProductID") _
            Join category In ds.Tables("Categories").AsEnumerable() On product.Field(Of Integer)("CategoryID") 
            Equals category.Field(Of Integer)("CategoryID") _
            Join order In ds.Tables("Orders").AsEnumerable() On detail.Field(Of Integer)("OrderID") 
            Equals order.Field(Of Integer)("OrderID") _
            Join customer In ds.Tables("Customers").AsEnumerable() On order.Field(Of String)("CustomerID") 
            Equals customer.Field(Of String)("CustomerID") _
            Join employee In ds.Tables("Employees").AsEnumerable() On order.Field(Of Integer)("EmployeeID") 
    
    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")
    

    テーブルのプライマリキーを所定のフィールドに結合して、各テーブルをクエリーに接続します。たとえば、Products テーブルは ProductID を使用して結合し、Categories は CategoryID を使用して結合します。

  7. 次の Select 文を追加して、上のクエリーで指定したフィールドを含む新しい匿名クラスを作成します。フィールドは、テーブルフィールドに直接マップすることも、計算することもできます。
    Select New With
      {
        Key .Sales = (detail.Field(Of Short)("Quantity") 
        * CDbl(detail.Field(Of Decimal)("UnitPrice"))) 
        * (1 - CDbl(detail.Field(Of Single)("Discount"))),
        Key .OrderDate = order.Field(Of Date)("OrderDate"),
        Key .Product = product.Field(Of String)("ProductName"),
        Key .Customer = customer.Field(Of String)("CompanyName"),
        Key .Country = customer.Field(Of String)("Country"),
        Key .Employee = employee.Field(Of String)("FirstName") & " " 
        & employee.Field(Of String)("LastName"),
        Key .Category = category.Field(Of String)("CategoryName")}
    
    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")
    };
    
  8. ToList() メソッドを使用して、LINQ クエリーをリストに変換し、結果リストを FlexPivotPage クラスの DataSource プロパティに割り当てます。
    c1FlexPivotPage1.DataSource = q.ToList()
    
    c1FlexPivotPage1.DataSource = q.ToList();
    
  9. アプリケーションの実行時、初期ビューとしてロードされるデフォルトのビューを作成します。
    Dim fp = c1FlexPivotPage1.FlexPivotPanel.PivotEngine
    fp.BeginUpdate()
    fp.RowFields.Add("Country")
    fp.ColumnFields.Add("Category")
    fp.ValueFields.Add("Sales")
    fp.EndUpdate()
    
    var fp = c1FlexPivotPage1.FlexPivotPanel.PivotEngine;
    fp.BeginUpdate();
    fp.RowFields.Add("Country");
    fp.ColumnFields.Add("Category");
    fp.ValueFields.Add("Sales");
    fp.EndUpdate();
    
  10. プロジェクトを実行して、FlexPivotPage コントロールが Nwind_ja.mdb データベースファイルで定義されたテーブルのデータに連結されていることを確認します。