Partager via


Tri avec DataView (LINQ to DataSet)

La possibilité de trier des données en utilisant des critères spécifiques, puis de les présenter à un client via un contrôle d'interface utilisateur, est un important aspect de la liaison de données.DataView propose plusieurs manières de trier les données et de retourner des sous-ensembles de lignes de données triés suivant des critères de tri spécifiques.Outre ses capacités de tri basé sur chaîne, DataView vous donne la possibilité d'utiliser des expressions LINQ (Language Integrated Query) pour les critères de tri. Les expressions LINQ permettent des opérations de tri bien plus complexes et puissantes que le tri basé sur chaîne.Cette rubrique décrit les deux approches du tri à l'aide de DataView.

Création d'un DataView à partir d'une requête avec des informations de tri

Un objet DataView peut être créé à partir d'une requête LINQ to DataSet.Si cette requête contient une clause OrderBy, OrderByDescending, ThenBy ou ThenByDescending, les expressions de ces clauses servent de base pour trier les données dans le DataView.Par exemple, si la requête contient les clauses Order By…  et Then By…, le DataView résultant trie les données selon les deux colonnes spécifiées.

Le tri basé sur une expression offre un tri plus puissant et plus complexe que le tri basé sur chaîne.Notez que les tris basés sur chaîne et sur une expression s'excluent mutuellement.Si le Sort basé sur chaîne après la création d'un DataView à partir d'une requête, le filtre basé sur une expression déduit de la requête est supprimé et ne peut pas être réinitialisé.

L'index d'un DataView est construit à la fois lors de la création du DataView et lorsque l'une des informations de tri ou de filtrage est modifiée.Vous obtenez des performances optimales en fournissant des critères de tri dans la requête LINQ to DataSet à partir de laquelle le DataView est créé et en ne modifiant pas ultérieurement les informations de tri.Pour plus d'informations, voir Performances des DataView.

RemarqueRemarque

Dans la plupart des cas, les expressions utilisées pour le tri ne doivent pas avoir d'effets secondaires et doivent être déterministes.De plus, les expressions ne doivent pas contenir de logique dépendant d'un nombre défini d'exécutions, parce que les opérations de tri doivent pouvoir être exécutées de façon illimitée.

Exemple

L'exemple suivant interroge la table SalesOrderHeader et trie les lignes retournées par date de commande ; crée un DataView à partir de cette requête, et lie le DataView à une BindingSource.

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
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;

Exemple

L'exemple suivant interroge la table SalesOrderHeader et trie la ligne retournée par montant total dû ; crée un DataView à partir de cette requête, et lie le DataView à une BindingSource.

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
            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;

Exemple

L'exemple suivant interroge la table SalesOrderDetail et trie les lignes retournées par quantité commandée, puis par ID de commande ; crée un DataView à partir de cette requête, et lie le DataView à une BindingSource.

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
            DataTable orders = dataSet.Tables["SalesOrderDetail"];

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

            DataView view = query.AsDataView();

            bindingSource1.DataSource = view;

Utilisation de la propriété de tri basé sur chaîne

La fonctionnalité de tri basé sur chaîne existante de DataView fonctionne toujours avec LINQ to DataSet. Après qu'un DataView a été créé à partir d'une requête LINQ to DataSet, vous pouvez utiliser la propriété Sort pour définir le tri du DataView.

Les fonctionnalités de tri basé sur chaîne et sur une expression s'excluent mutuellement.La définition de la propriété Sort efface le tri basé sur des expressions hérité de la requête à partir de laquelle le DataView a été créé.

Pour plus d'informations sur le filtrage Sort basé sur chaîne, voir Tri et filtrage de données (ADO.NET).

Exemple

L'exemple suivant crée un DataView à partir de la table Contact, puis trie les lignes par nom par ordre décroissant, puis les prénoms par ordre croissant :

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

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

DataView view = contacts.AsDataView();

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

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

Exemple

L'exemple suivant interroge la table Contact pour extraire les noms commençant par la lettre « S ».Un DataView est créé à partir de cette requête et lié à un objet BindingSource.

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 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";

Suppression du tri

Les informations de tri d'un DataView peuvent être supprimées une fois qu'il a été défini à l'aide de la propriété Sort.Il existe deux façons de supprimer les informations de tri d'un DataView :

  • Définissez la propriété Sort sur null.

  • Définissez la propriété Sort en tant que chaîne vide.

Exemple

L'exemple suivant crée un DataView à partir d'une requête, puis supprime le tri en définissant la propriété Sort en tant que chaîne vide :

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 = ""
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 = "";

Exemple

L'exemple suivant crée une table DataView à partir de la table Contact, puis définit la propriété Sort pour effectuer un tri des noms par ordre décroissant :Les informations de tri sont ensuite effacées en définissant la propriété Sort sur 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
DataTable contacts = dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.Sort = "LastName desc";

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

// Clear the sort.
view.Sort = null;

Voir aussi

Concepts

Liaison de données et LINQ to DataSet

Filtrage avec DataView (LINQ to DataSet)

Tri des données