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. En plus de ses fonctionnalités de tri basé sur chaîne, DataView vous permet d’utiliser des expressions LINQ (Language-Integrated Query) pour les critères de tri. Les expressions LINQ permettent d’effectuer des opérations de tri beaucoup 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 la DataView. Par exemple, si la requête contient les clauses Order By…
et Then By…
, le DataView résultant trie les données sur 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 la DataView est créée, et en ne modifiant pas ultérieurement les informations de tri. Pour plus d’informations, consultez Performances de DataView.
Notes
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.
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
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.
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
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.
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
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 sur le 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, consultez Tri et filtrage des données.
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 :
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()
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.
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"
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 :
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 :
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 = ""
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
:
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