LINQ to DataSet コンテキストで DataView を作成するには、2 つの方法があります。 DataView に対する LINQ to DataSet クエリからDataTableを作成することもできますし、型指定されたDataTableまたは型指定されていないDataTableから作成することもできます。 どちらの場合も、DataView拡張メソッドのいずれかを使用してAsDataViewを作成します。DataViewは LINQ to DataSet コンテキストでは直接構築できません。
DataViewが作成されたら、Windows フォーム アプリケーションまたは ASP.NET アプリケーションの UI コントロールにバインドしたり、フィルター処理と並べ替えの設定を変更したりできます。
DataView はインデックスを構築します。これにより、フィルター処理や並べ替えなど、インデックスを使用できる操作のパフォーマンスが大幅に向上します。 DataViewのインデックスは、DataViewが作成されたときと、並べ替えまたはフィルター処理の情報のいずれかが変更されたときに作成されます。 DataViewを作成し、後で並べ替えまたはフィルター処理の情報を設定すると、インデックスが少なくとも 2 回作成されます。インデックスは、DataViewが作成されたときに 1 回、並べ替えまたはフィルターのプロパティが変更されたときにもう一度作成されます。
DataViewを使用したフィルター処理と並べ替えの詳細については、「DataView を使用したフィルター処理」および「DataView による並べ替え」を参照してください。
LINQ to DataSet クエリからの DataView の作成
linq to DataSet クエリの結果から DataView オブジェクトを作成できます。このクエリの結果は、 DataRow オブジェクトのプロジェクションです。 新しく作成された DataView は、作成されたクエリからフィルター処理と並べ替えの情報を継承します。
注
ほとんどの場合、フィルター処理と並べ替えに使用される式は副作用を持たず、決定論的である必要があります。 また、並べ替え操作とフィルター処理操作は何度でも実行される可能性があるため、式には、設定された実行回数に依存するロジックを含めないようにしてください。
匿名型を返すクエリまたは結合操作を実行するクエリからの 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 をフィルター処理および並べ替えることもできます。 これにより、クエリから継承された並べ替えとフィルター処理の情報がクリアされることに注意してください。 次の例では、LINQ to DataSet クエリから、'S' で始まる姓でフィルター処理する DataView を作成します。 文字列ベースの 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 の作成
LINQ to DataSet クエリから作成するだけでなく、DataView メソッドを使用してDataTableからAsDataView オブジェクトを作成することもできます。
次の例では、SalesOrderDetail テーブルから DataView を作成し、 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で設定できます。 次の例では、Contact テーブルから DataView を作成し、姓を昇順に並べ替え、名を降順に並べ替える 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 を作成するときにフィルター処理と並べ替えの情報を指定し、後で変更しないようにすることをお勧めします。