Création d'un objet DataView (LINQ to DataSet)

Il existe deux manières de créer une DataView dans le contexte de LINQ to DataSet. Vous pouvez créer une 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 la DataView en utilisant une des méthodes d’extension de AsDataView ; DataView n’est pas directement constructible dans le contexte de 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 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 du 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 DataView, consultez Filtrage avec DataView et Tri avec DataView.

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éé.

Notes

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 quand un objet DataView est créé à partir d’une requête LINQ to DataSet, la méthode Select doit être la dernière méthode appelée dans la requête. Ceci est illustré dans l’exemple suivant, qui crée une DataView de commandes en ligne triées par montant total dû :

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag")
    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() _
    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

Vous pouvez aussi utiliser les propriétés RowFilter et Sort basées sur une chaîne pour filtrer et trier une 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 une DataView à partir d’une requête LINQ to DataSet qui filtre sur les 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 :

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"

Création d'un DataView à partir d'un DataTable

En plus d’être créé à partir d’une requête LINQ to DataSet, un objet DataView peut être créé à partir d’une DataTable en utilisant 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.

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

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

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

Dim view As DataView = 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 :

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

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