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

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 によるフィルター処理」および「DataView による並べ替え」をご覧ください。

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

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

Note

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

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

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

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

DataTable orders = _dataSet.Tables["SalesOrderHeader"];

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

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
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

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

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";
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 からの DataView の作成

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

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

DataTable orders = _dataSet.Tables["SalesOrderDetail"];

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

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

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

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

DataTable contacts = _dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

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

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

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

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

関連項目