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

LINQ to DataSet のコンテキストで DataView を作成するには 2 つの方法があります。There are two ways to create a DataView in the LINQ to DataSet context. DataView は、DataTable に対する LINQ to DataSet のクエリから作成したり、型指定されているまたは型指定されていない DataTable から作成したりできます。You can create a DataView from a LINQ to DataSet query over a DataTable, or you can create it from a typed or un-typed DataTable. どちらの場合でも、DataView を作成するには、いずれかの AsDataView 拡張メソッドを使用します。LINQ to DataSet のコンテキストで DataView を直接作成することはできません。In both cases, you create the DataView by using one of the AsDataView extension methods; DataView is not directly constructible in the LINQ to DataSet context.

DataView を作成した後に、Windows フォーム アプリケーションまたは ASP.NET アプリケーションの UI コントロールにバインドしたり、フィルターおよび並べ替えの設定を変更したりできます。After the DataView has been created, you can bind it to a UI control in a Windows forms application or an ASP.NET application, or change the filtering and sorting settings.

DataView は、インデックスを構築します。これにより、フィルター処理や並べ替えなど、インデックスを使用できる操作のパフォーマンスが大幅に向上します。DataView constructs an index, which significantly increases the performance of operations that can use the index, such as filtering and sorting. DataView のインデックスは、DataView の作成時に構築されるほか、並べ替えまたはフィルター処理の情報が変更されたときにも構築されます。The index for a DataView is built both when the DataView is created and when any of the sorting or filtering information is modified. DataView を作成した後で、並べ替えまたはフィルター処理の情報を設定した場合、インデックスが最低でも 2 回 (DataView の作成時と、並べ替えまたはフィルターのプロパティの変更時) 構築されることになります。Creating a DataView and then setting the sorting or filtering information later causes the index to be built at least twice: once when the DataView is created, and again when any of the sort or filter properties are modified.

DataView でのフィルター処理と並べ替えについて詳しくは、「DataView によるフィルター処理」および「DataView による並べ替え」をご覧ください。For more information about filtering and sorting with DataView, see Filtering with DataView and Sorting with DataView.

LINQ to DataSet クエリの結果からの DataView の作成Creating DataView from a LINQ to DataSet Query

DataView オブジェクトは、DataRow オブジェクトの射影である LINQ to DataSet のクエリの結果から作成できます。A DataView object can be created from the results of a LINQ to DataSet query, where the results are a projection of DataRow objects. 新しく作成される DataView は、その基となるクエリからのフィルター処理および並べ替え情報を継承します。The newly created DataView inherits the filtering and sorting information from the query it is created from.

注意

ほとんどの場合、フィルターに使用する式は、副作用のない確定的な式である必要があります。In most cases, the expressions used for filtering and sorting should not have side effects and must be deterministic. また、並べ替えおよびフィルター処理は任意の回数実行されるため、特定の実行回数に依存するロジックが式に含まれないようにしてください。Also, the expressions should not contain any logic that depend on a set number of executions, as the sorting and filtering operations may be executed any number of times.

匿名型を返すクエリまたは結合操作を実行するクエリからの DataView の作成はサポートされていません。Creating a DataView from a query that returns anonymous types or queries that perform join operations is not supported.

DataView の作成に使用されるクエリでは、次のクエリ演算子のみがサポートされます。Only the following query operators are supported in a query used to create DataView:

LINQ to DataSet のクエリから DataView を作成する場合は、クエリで最後に呼び出されるメソッドを Select メソッドにする必要があることに注意してください。Note that when a DataView is created from a LINQ to DataSet query the Select method must be the final method called in the query. 合計支払額別に並べ替えられたオンライン注文の DataView を作成する次の例では、このことが示されています。This is shown in the following example, which creates a DataView of online orders sorted by total due:

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;
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 のフィルター処理や並べ替えを行うことができます。You can also use the string-based RowFilter and Sort properties to filter and sort a DataView after it has been created from a query. この操作を行うと、クエリから継承された並べ替えおよびフィルター情報がクリアされます。Note that this will clear the sorting and filtering information inherited from the query. 次の例では、"S" で始まる姓でフィルター処理を行う DataView を、LINQ to DataSet のクエリから作成します。The following example creates a DataView from a LINQ to DataSet query that filters by last names that start with 'S'. 文字列ベースの Sort プロパティは、姓を昇順に並べ替え、名を降順に並べ替えるように設定されています。The string-based Sort property is set to sort on last names in ascending order and then first names in descending order:

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 の作成Creating a DataView from a DataTable

DataView オブジェクトは、LINQ to DataSet のクエリから作成できるほか、AsDataView メソッドを使用して DataTable から作成することもできます。In addition to being created from a LINQ to DataSet query, a DataView object can be created from a DataTable by using the AsDataView method.

次の例では、DataView を SalesOrderDetail テーブルから作成した後、BindingSource オブジェクトのデータ ソースとして設定します。The following example creates a DataView from the SalesOrderDetail table and sets it as the data source of a BindingSource object. このオブジェクトは、DataGridView コントロールのプロキシとして動作します。This object acts as a proxy for a DataGridView control.

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 を作成した後、フィルターおよび並べ替えを設定できます。Filtering and sorting can be set on the DataView after it has been created from a DataTable. 次の例では、DataView を Contact テーブルから作成した後、姓を昇順に並べ替え、名を降順に並べ替えるための Sort プロパティを設定します。The following example creates a DataView from the Contact table and sets the Sort property to sort on last names in ascending order and then first names in descending order:

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 により、フィルター処理および並べ替え処理をサポートするためのインデックスが構築されるからです。However, there is a performance loss that comes with setting the RowFilter or Sort property after the DataView has been created from a query, because DataView constructs an index to support filtering and sorting operations. RowFilter プロパティまたは Sort プロパティを設定すると、データのインデックスが再構築され、アプリケーションのオーバーヘッドが増加してパフォーマンスの低下を招きます。Setting the RowFilter or Sort property rebuilds the index for the data, adding overhead to your application and decreasing performance. 可能な場合は、DataView を最初に作成するときにフィルター処理および並べ替え情報を指定して、後で情報を変更するのを避けてください。When possible, it is better to specify the filtering and sorting information when you first create the DataView and avoid modifying it afterwards.

関連項目See also