Partager via


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

Il existe deux façons de créer un DataView dans le contexte 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 le DataView en utilisant l’une des méthodes d’extension AsDataView ; DataView n’est pas directement constructible dans le contexte LINQ to DataSet.

Une fois le DataView fichier créé, vous pouvez le lier à un contrôle d’interface utilisateur dans une application Windows Forms ou une application ASP.NET, ou modifier les paramètres de filtrage et de tri.

DataView construit un index, ce qui augmente considérablement les performances des opérations qui peuvent utiliser l’index, comme le filtrage et le tri. L’index d’un DataView est généré à la fois lors de la DataView création et quand l’une des informations de tri ou de filtrage est modifiée. La création d'un DataView suivie de la mise en place des informations de tri ou de filtrage entraîne la génération de l'index au moins deux fois : une première fois lors de la création du DataView, puis à nouveau lorsque l'une des propriétés de tri ou de filtre 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 de DataView à partir d’une requête LINQ to DataSet

Un DataView objet peut être créé à partir des résultats d’une requête LINQ to DataSet, où les résultats sont une projection d’objets DataRow . La nouvelle création DataView hérite des informations de filtrage et de tri de la requête à partir de laquelle elle est créée.

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. En outre, les expressions ne doivent contenir aucune logique qui dépend d’un nombre défini d’exécutions, car les opérations de tri et de filtrage peuvent être exécutées plusieurs fois.

La création d'un DataView à partir d'une requête qui retourne des types anonymes ou à partir de requêtes qui effectuent des opérations de jointure n'est pas prise en charge.

Seuls les opérateurs de requête suivants sont pris en charge dans une requête utilisée pour créer DataView:

Notez que lorsqu'une requête est créée à partir d'une requête LINQ to DataSet, la méthode DataView doit être la dernière méthode appelée dans la requête. Ceci est illustré dans l’exemple suivant, qui crée un DataView de commandes en ligne triées par 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 efface les 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 les noms de famille commençant par « S ». La propriété basée sur Sort une chaîne est définie pour trier les noms dans l’ordre croissant, puis les prénoms dans l’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 suivant crée un DataView à partir de la table SalesOrderDetail et l’utilise comme source de données pour un objet BindingSource. Cet objet agit en tant que proxy pour un DataGridView contrôle.

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 tri et le filtrage peuvent être définis sur le DataView après sa création à partir d’un DataTable. L’exemple suivant crée un objet DataView à partir de la table des contacts et définit la propriété Sort pour trier sur les noms de famille dans l’ordre croissant, puis sur les prénoms dans l’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()

Toutefois, une perte de performances est liée à la définition de la propriété RowFilter ou Sort après que DataView a été créé à partir d'une requête, car DataView construit un index pour prendre en charge les opérations de filtrage et de tri. La définition des propriétés RowFilter ou Sort reconstruit l’index pour les données, ajoutant ainsi une surcharge à votre application et réduisant ses performances. Lorsque cela est possible, il est préférable de spécifier les informations de filtrage et de tri lors de la première création du DataView, puis d’éviter de le modifier par la suite.

Voir aussi