このトピックでは、Find クラスのFindRowsメソッドとDataView メソッドを使用すること、および Web アプリケーションでDataViewをキャッシュする場合のパフォーマンス上の利点について説明します。
Find と FindRows
DataView はインデックスを構築します。 インデックスには、テーブル内またはビュー内の 1 つ以上の列から構築されたキーが含まれています。 これらのキーは、 DataView がキー値に関連付けられている行を迅速かつ効率的に検索できる構造に格納されます。 インデックスを使用する操作 (フィルター処理や並べ替えなど) では、パフォーマンスが大幅に向上します。 DataViewのインデックスは、DataViewが作成されたときと、並べ替えまたはフィルター処理の情報のいずれかが変更されたときに作成されます。 DataViewを作成し、後で並べ替えまたはフィルター処理の情報を設定すると、インデックスが少なくとも 2 回作成されます。インデックスは、DataViewが作成されたときに 1 回、並べ替えまたはフィルターのプロパティが変更されたときにもう一度作成されます。 DataViewを使用したフィルター処理と並べ替えの詳細については、「DataView を使用したフィルター処理」および「DataView による並べ替え」を参照してください。
データのサブセットの動的ビューを提供するのではなく、データに対する特定のクエリの結果を返す場合は、Find プロパティを設定するのではなく、FindRowsのDataViewまたはRowFilterメソッドを使用できます。 RowFilter プロパティは、バインドされたコントロールがフィルター処理された結果を表示するデータ バインド アプリケーションで最適に使用されます。 RowFilter プロパティを設定すると、データのインデックスが再構築され、アプリケーションにオーバーヘッドが追加され、パフォーマンスが低下します。 Findメソッドと FindRows メソッドでは、インデックスを再構築する必要なく、現在のインデックスを使用します。 FindまたはFindRowsを 1 回だけ呼び出す場合は、既存のDataViewを使用する必要があります。 FindまたはFindRowsを複数回呼び出す場合は、検索する列にインデックスを再構築する新しいDataViewを作成してから、FindまたはFindRowsメソッドを呼び出す必要があります。 FindメソッドとFindRowsメソッドの詳細については、「行の検索」を参照してください。
次の例では、 Find メソッドを使用して、姓が "Zhu" の連絡先を検索します。
DataTable contacts = _dataSet.Tables["Contact"];
EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
orderby contact.Field<string>("LastName")
select contact;
DataView view = query.AsDataView();
// Find a contact with the last name of Zhu.
var found = view.Find("Zhu");
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Order By contact.Field(Of String)("LastName") _
Select contact
Dim view As DataView = query.AsDataView()
Dim found As Integer = view.Find("Zhu")
次の例では、 FindRows メソッドを使用して、すべての赤い色の製品を検索します。
DataTable products = _dataSet.Tables["Product"];
EnumerableRowCollection<DataRow> query = from product in products.AsEnumerable()
orderby product.Field<decimal>("ListPrice"), product.Field<string>("Color")
select product;
DataView view = query.AsDataView();
view.Sort = "Color";
var criteria = new object[] { "Red" };
DataRowView[] foundRowsView = view.FindRows(criteria);
Dim products As DataTable = dataSet.Tables("Product")
Dim query = _
From product In products.AsEnumerable() _
Order By product.Field(Of Decimal)("ListPrice"), product.Field(Of String)("Color") _
Select product
Dim view As DataView = query.AsDataView()
view.Sort = "Color"
Dim criteria As Object() = New Object() {"Red"}
Dim foundRowsView As DataRowView() = view.FindRows(criteria)
ASP.NET
ASP.NET には、メモリ内に作成する広範なサーバー リソースを必要とするオブジェクトを格納できるキャッシュ メカニズムがあります。 これらの種類のリソースをキャッシュすると、アプリケーションのパフォーマンスが大幅に向上する可能性があります。 キャッシュは、各アプリケーションに対してプライベートなキャッシュ インスタンスを使用して、 Cache クラスによって実装されます。 新しい DataView オブジェクトの作成はリソースを大量に消費する可能性があるため、Web ページが更新されるたびに DataView を再構築する必要がないように、Web アプリケーションでこのキャッシュ機能を使用できます。
次の例では、ページの更新時にデータを再ソートする必要がないように、 DataView がキャッシュされます。
If (Cache("ordersView") = Nothing) Then
Dim dataSet As New DataSet()
FillDataSet(dataSet)
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()
Cache.Insert("ordersView", view)
End If
Dim ordersView = CType(Cache("ordersView"), DataView)
GridView1.DataSource = ordersView
GridView1.DataBind()
if (Cache["ordersView"] == null)
{
// Fill the DataSet.
DataSet dataSet = FillDataSet();
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();
Cache.Insert("ordersView", view);
}
DataView ordersView = (DataView)Cache["ordersView"];
GridView1.DataSource = ordersView;
GridView1.DataBind();