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

特定の条件に基づいてデータを並べ替え、UI コントロールを介してそのデータをクライアントに提供する機能は、データ バインディングの重要な特徴です。 DataView には、データを並べ替え、特定の並べ替え条件に従って並べ替えられたデータ行を返す方法がいくつか用意されています。 文字列ベースの並べ替え機能に加え、DataView では、並べ替え条件として LINQ (統合言語クエリ) の式を使用できます。 LINQ 式を使用すると、文字列ベースの並べ替え処理よりもはるかに複雑で強力な並べ替え処理を実行できます。 このトピックでは、DataView を使用して並べ替えを行うこの 2 つの方法について説明します。

並べ替え情報を含むクエリによる DataView の作成

DataView オブジェクトは LINQ to DataSet クエリから作成できます。 そのクエリに OrderBy 句、OrderByDescending 句、ThenBy 句、または ThenByDescending 句が含まれている場合、これらの句の式が、DataView 内のデータを並べ替えるための基準として使用されます。 たとえば、クエリに Order By… 句と Then By… 句が含まれている場合、結果の DataView では、指定された両方の列によってデータが並べ替えられます。

式ベースの並べ替えは、文字列ベースの並べ替えよりもはるかに強力で複雑な並べ替え機能を提供します。 文字列ベースの並べ替え機能と式ベースの並べ替え機能は、相互に排他的です。 Sort をクエリから作成した後に文字列ベースの DataView を設定した場合、クエリから推論される式ベースの並べ替えはクリアされます (再設定できません)。

DataView のインデックスは、DataView の作成時に構築されるほか、並べ替えまたはフィルター処理の情報が変更されたときにも構築されます。 最高のパフォーマンスを得るには、DataView の作成元である LINQ to DataSet クエリで並べ替え条件を指定し、後で並べ替え情報を変更しないようにします。 詳しくは、「DataView のパフォーマンス」をご覧ください。

Note

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

次の例では、SalesOrderHeader テーブルに対してクエリを実行し、返された行を発注日順に並べ替えます。次にこのクエリから DataView を作成し、DataViewBindingSource にバインドします。

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<DateTime>("OrderDate")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of DateTime)("OrderDate") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

次の例では、SalesOrderHeader テーブルに対してクエリを実行し、返された行を合計支払額順に並べ替えます。次にこのクエリから DataView を作成し、DataViewBindingSource にバインドします。

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    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() _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

次の例では、SalesOrderDetail テーブルに対してクエリを実行し、返された行を注文数量順および販売注文 ID 順に並べ替えます。次にこのクエリから DataView を作成し、DataViewBindingSource にバインドします。

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<short>("OrderQty"), order.Field<int>("SalesOrderID")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Int16)("OrderQty"), order.Field(Of Integer)("SalesOrderID") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

文字列ベースの Sort プロパティの使用

DataView の文字列ベースの並べ替え機能は LINQ to DataSet で動作します。 DataView を LINQ to DataSet クエリから作成した後、Sort プロパティを使用して、DataView の並べ替えを設定できます。

文字列ベースの並べ替え機能と式ベースの並べ替え機能は、相互に排他的です。 Sort プロパティを設定すると、DataView の作成元のクエリから推論される式ベースの並べ替えはクリアされます。

文字列ベースの Sort のフィルター処理について詳しくは、「データの並べ替えとフィルター処理」をご覧ください。

次の例では、DataView を Contact テーブルから作成した後、姓を降順に並べ替え、名を昇順に並べ替えます。

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()

次の例では、姓が "S" で始まる連絡先を取得するクエリを Contact テーブルに対して実行します。 このクエリから DataView が作成され、BindingSource オブジェクトにバインドされます。

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"

並べ替えのクリア

DataView の並べ替え情報は、Sort プロパティを使用すると、並べ替えが設定された後にクリアできます。 DataView の並べ替え情報は、2 つの方法でクリアできます。

  • Sort プロパティを nullに設定します。

  • Sort プロパティを空の文字列に設定します。

次の例では、クエリから DataView を作成した後、Sort プロパティを空の文字列に設定して並べ替えをクリアします。

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

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

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

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

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = ""

次の例では、Contact テーブルから DataView を作成し、Sort プロパティを設定して、連絡先の姓を降順に並べ替えます。 次に、Sort プロパティを null に設定して並べ替え情報をクリアします。

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

DataView view = contacts.AsDataView();

view.Sort = "LastName desc";

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

// Clear the sort.
view.Sort = null;
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

'Clear the sort.
view.Sort = Nothing

関連項目