Création d'un objet DataView (LINQ to DataSet)
Mise à jour : November 2007
Il existe deux manières de créer un DataView dans le contexte de LINQ to DataSet. Vous pouvez créer un DataView à partir d'une requête LINQ to DataSet sur une DataTable, ou vous pouvez la créer à partir d'une DataTable typée ou non typée. Dans les deux cas, vous créez l'objet DataView en utilisant l'une des méthodes d'extension AsDataView ; l'objet DataView ne peut pas être construit directement dans le contexte LINQ to DataSet.
Une fois le DataView créé, vous pouvez le lier à un contrôle d'interface utilisateur dans une application Windows Forms ou ASP.NET, ou modifier les paramètres de filtrage et de tri.
DataView construit un index, ce qui augmente considérablement les performances des applications qui utilisent l'index, telles que le filtrage et le tri. 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. La création d'un objet DataView, suivie de la définition des informations de tri et de filtrage, entraîne la construction de l'index deux fois au moins : une fois lors de la création de l'objet DataView, puis à nouveau lorsqu'une des propriétés de tri ou de filtrage est modifiée.
Pour plus d'informations sur le filtrage et le tri avec l'objet DataView, consultez Filtrage avec DataView (LINQ to DataSet) et Tri avec DataView (LINQ to DataSet).
Création d'un DataView à partir d'une requête LINQ to DataSet
Un objet DataView peut être créé à partir des résultats d'une requête LINQ to DataSet où les résultats sont une projection d'objets DataRow. L'objet DataView nouvellement créé hérite des informations de filtrage et de tri de la requête à partir de laquelle il a été créé.
Remarque : |
---|
Dans la plupart des cas, les expressions utilisées pour le filtrage et 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, étant donné que les opérations de tri et de filtrage doivent pouvoir être exécutées de façon illimitée. |
La création d'un DataView à partir d'une requête qui retourne des types anonymes ou des requêtes qui effectuent des opérations de jointure n'est pas prise en charge.
Seuls les opérateurs de requête ci-dessous sont pris en charge dans une requête utilisée pour créer un DataView :
Notez que, lorsqu'un objet DataView est créé à partir d'une requête LINQ to DataSet, la méthode Select<TRow, S> doit être la dernière méthode appelée dans la requête.Cela est illustré dans l'exemple suivant, qui crée un objet DataView de commandes en ligne triées par montant total dû :
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
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();
bindingSource1.DataSource = view;
Vous pouvez également utiliser les propriétés basées sur chaîne RowFilter et Sort pour filtrer et trier un DataView après sa création à partir d'une requête. Notez que cela entraîne la suppression des informations de tri et de filtrage héritées de la requête. L'exemple suivant crée un DataView à partir d'une requête LINQ to DataSet qui filtre par noms commençant par la lettre 'S'. La propriété Sort basée sur chaîne est définie pour un tri sur le nom par ordre croissant et sur le prénom par ordre décroissant :
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";
Création d'un DataView à partir d'un DataTable
Outre d'être créé à partir d'une requête LINQ to DataSet, un objet DataView peut être créé à partir d'un objet DataTable à l'aide de la méthode AsDataView.
L'exemple ci-dessous crée un DataView à partir de la table SalesOrderDetail et le définit comme source de données d'un objet BindingSource. Cet objet agit comme un proxy pour un contrôle DataGridView.
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")
Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
DataTable orders = dataSet.Tables["SalesOrderDetail"];
DataView view = orders.AsDataView();
bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Le filtrage et le tri peuvent être définis sur le DataView après qu'il a été créé à partir d'un DataTable. L'exemple suivant crée une table DataView à partir de la table Contact et définit la propriété Sort pour trier les noms par ordre croissant et les prénoms par ordre dé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();
Cependant, on constate une baisse de performance lorsqu'on définit la propriété RowFilter ou Sort après la création du DataView à partir d'une requête, parce que le DataView construit un index pour prendre en charge les opérations de filtrage et de tri. Le paramétrage de la propriété RowFilter ou Sort entraîne une nouvelle génération de l'index des données, ce qui accroît la charge pour votre application et, par voie de conséquence, fait baisser les performances. Dans la mesure du possible, il est préférable de spécifier les informations de filtrage et de tri dès la création du DataView et d'éviter de les modifier par la suite.
Voir aussi
Concepts
Liaison de données et LINQ to DataSet