次の方法で共有


DataView オブジェクトの作成 (LINQ to DataSet)

更新 : November 2007

LINQ to DataSet のコンテキストで DataView を作成するには 2 つの方法があります。DataView は、DataTable に対する LINQ to DataSet クエリから作成したり、型指定されているまたは型指定されていない DataTable から作成したりできます。どちらの場合でも、DataView を作成するのにいずれかの AsDataView 拡張メソッドを使用します。LINQ to DataSet のコンテキストで DataView を直接作成することはできません。

DataView を作成した後に、Windows フォーム アプリケーションまたは ASP.NET アプリケーションの UI コントロールにバインドしたり、フィルタおよび並べ替えの設定を変更したりできます。

DataView は、インデックスを構築します。これにより、フィルタ処理や並べ替えなど、インデックスを使用できる操作のパフォーマンスが大幅に向上します。DataView のインデックスは、DataView の作成時に構築されるほか、並べ替えまたはフィルタ処理の情報が変更されたときにも構築されます。DataView を作成した後で、並べ替えまたはフィルタ処理の情報を設定した場合、インデックスが最低でも 2 回 (DataView の作成時と、並べ替えまたはフィルタのプロパティの変更時) 構築されることになります。

DataView でのフィルタおよび並べ替えの詳細については、「DataView によるフィルタ選択 (LINQ to DataSet)」および「DataView による並べ替え (LINQ to DataSet)」を参照してください。

LINQ to DataSet クエリの結果からの DataView の作成

DataView オブジェクトは、DataRow オブジェクトの射影である LINQ to DataSet クエリの結果から作成できます。新しく作成される DataView は、その基となるクエリからのフィルタ処理および並べ替え情報を継承します。 

メモ :

ほとんどの場合、フィルタに使用する式は、副作用のない確定的な式である必要があります。また、並べ替えおよびフィルタ処理は任意の回数実行されるため、特定の実行回数に依存するロジックが式に含まれないようにしてください。

匿名型を返すクエリまたは結合操作を実行するクエリからの DataView の作成はサポートされていません。

DataView の作成に使用されるクエリでは、次のクエリ演算子のみがサポートされます。

LINQ to DataSet クエリから DataView を作成する場合は、Select<TRow, S> メソッドをクエリで呼び出す最後のメソッドとする必要があります。次の例では、合計支払額別に並べ替えられたオンライン注文の DataView を作成します。

Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
DataTable orders = dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag") == true
    orderby order.Field<decimal>("TotalDue")
    select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

また、文字列ベースの RowFilter プロパティおよび Sort プロパティを使用して、DataView をクエリから作成した後でフィルタを適用し、並べ替えることができます。この操作を行うと、クエリから継承された並べ替えおよびフィルタ情報がクリアされます。次の例では、姓が "S" で始まる連絡先をフィルタ処理する LINQ to DataSet クエリから DataView を作成します。文字列ベースの Sort プロパティは、姓を昇順に並べ替え、名を降順に並べ替えるように設定されています。

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim query = _
    From contact In contacts.AsEnumerable() _
    Where contact.Field(Of String)("LastName").StartsWith("S") _
    Select contact

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"
DataTable contacts = dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
                                         where contact.Field<string>("LastName").StartsWith("S")
                                         select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "LastName desc, FirstName asc";

DataTable からの DataView の作成

DataView オブジェクトは、LINQ to DataSet クエリから作成できるほか、AsDataView メソッドを使用して DataTable から作成することもできます。

次の例では、DataView を SalesOrderDetail テーブルから作成した後、BindingSource オブジェクトのデータ ソースとして設定します。このオブジェクトは、DataGridView コントロールのプロキシとして動作します。

Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
DataTable orders = dataSet.Tables["SalesOrderDetail"];

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();

DataTable から DataView を作成した後、フィルタおよび並べ替えを設定できます。次の例では、DataView を Contact テーブルから作成した後、姓を昇順に並べ替え、名を降順に並べ替えるための Sort プロパティを設定します。

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
DataTable contacts = dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.Sort = "LastName desc, FirstName asc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

ただし、DataView をクエリから作成した後に RowFilter プロパティまたは Sort プロパティを設定する操作を行うと、パフォーマンスが低下します。なぜなら、DataView により、フィルタ処理および並べ替え処理をサポートするためのインデックスが構築されるからです。RowFilter プロパティまたは Sort プロパティを設定すると、データのインデックスが再構築され、アプリケーションのオーバーヘッドが増加してパフォーマンスの低下を招きます。可能な場合は、DataView を最初に作成するときにフィルタ処理および並べ替え情報を指定して、後で情報を変更するのを避けてください。

参照

概念

データ バインドと LINQ to DataSet

DataView によるフィルタ選択 (LINQ to DataSet)

DataView による並べ替え (LINQ to DataSet)