Partager via


Requêtes d'analyse unique (LINQ to DataSet)

Les requêtes LINQ (Language-Integrated Query) fonctionnent sur des sources de données qui implémentent l’interface IEnumerable<T> ou l’interface IQueryable<T>. La DataTable classe n’implémente pas l’une ou l’autre interface. Vous devez donc appeler la AsEnumerable méthode si vous souhaitez utiliser la DataTable méthode comme source dans la From clause d’une requête LINQ.

L’exemple suivant obtient toutes les commandes en ligne de la table SalesOrderHeader et génère l’ID de commande, la date de commande et le numéro de commande dans la console.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

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

var query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag") == true
    select new
    {
        SalesOrderID = order.Field<int>("SalesOrderID"),
        OrderDate = order.Field<DateTime>("OrderDate"),
        SalesOrderNumber = order.Field<string>("SalesOrderNumber")
    };

foreach (var onlineOrder in query)
{
    Console.WriteLine($"Order ID: {onlineOrder.SalesOrderID} Order date: {onlineOrder.OrderDate:d} Order number: {onlineOrder.SalesOrderNumber}");
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Select New With { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
     }

For Each onlineOrder In query
    Console.Write("Order ID: " & onlineOrder.SalesOrderID)
    Console.Write(" Order date: " & onlineOrder.OrderDate)
    Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next

La requête de variable locale est initialisée avec une expression de requête, qui fonctionne sur une ou plusieurs sources d’informations en appliquant un ou plusieurs opérateurs de requête à partir des opérateurs de requête standard ou, dans le cas de LINQ to DataSet, opérateurs spécifiques à la DataSet classe. L’expression de requête de l’exemple précédent utilise deux des opérateurs de requête standard : Where et Select.

La Where clause filtre la séquence en fonction d’une condition, dans ce cas, que la valeur OnlineOrderFlag est définie true. L’opérateur Select alloue et retourne un objet énumérable qui capture les arguments passés à l’opérateur. Dans cet exemple ci-dessus, un type anonyme est créé avec trois propriétés : SalesOrderID, OrderDateet SalesOrderNumber. Les valeurs de ces trois propriétés sont définies sur les valeurs des colonnes SalesOrderID, OrderDate et SalesOrderNumber de la table SalesOrderHeader.

La foreach boucle énumère ensuite l’objet énumérable retourné par Select et génère les résultats de la requête. Étant donné que la requête est un Enumerable type, qui implémente IEnumerable<T>, l’évaluation de la requête est différée jusqu’à ce que la variable de requête soit itérée à l’aide de la foreach boucle. L’évaluation différée des requêtes permet de conserver les requêtes en tant que valeurs pouvant être évaluées plusieurs fois, chaque fois produisant des résultats potentiellement différents.

La Field méthode fournit l’accès aux valeurs de colonne d’un DataRow et au SetField (non indiqué dans l’exemple précédent) définit les valeurs de colonne dans un DataRow. Les méthodes Field et SetField gèrent les types de valeurs pouvant être nulles, vous n’avez donc pas besoin de vérifier explicitement les valeurs nulles. Les deux méthodes sont des méthodes génériques, ce qui signifie que vous n’avez pas besoin de caster le type de retour. Vous pouvez utiliser l’accesseur de colonne préexistant dans DataRow (par exemple), o["OrderDate"]mais cela vous oblige à convertir l’objet de retour en type approprié. Si la colonne est un type valeur nullable, vous devez vérifier si la valeur est null à l’aide de la IsNull méthode. Pour plus d’informations, consultez Les méthodes Generic Field et SetField.

Notez que le type de données spécifié dans le paramètre générique T de la méthode Field et de la méthode SetField doit correspondre au type de la valeur sous-jacente, sinon une InvalidCastException sera levée. Le nom de colonne spécifié doit également correspondre au nom d’une colonne dans le DataSet ou un ArgumentException sera lancé. Dans les deux cas, l’exception est levée lors de l’énumération des données d’exécution lorsque la requête est exécutée.

Voir aussi