Méthodes génériques Field et SetField (LINQ to DataSet)

LINQ to DataSet fournit des méthodes d’extension à la classe DataRow pour accéder aux valeurs de colonne : la méthode Field et la méthode SetField. Ces méthodes facilitent l'accès des développeurs aux valeurs de colonne, particulièrement pour les valeurs Null. Le DataSet utilise DBNull.Value pour représenter des valeurs Null, tandis que LINQ utilise les types Nullable et Nullable<T>. Pour pouvoir utiliser l’accesseur de colonne existant dans DataRow, vous devez effectuer un cast de l’objet retourné vers le type approprié. Si un champ particulier d’un DataRow peut avoir la valeur Null, vous devez vérifier explicitement si une valeur est Null, car le fait de retourner une DBNull.Value et d’effectuer implicitement un cast vers un autre type lève une InvalidCastException. Dans l’exemple suivant, si la méthode DataRow.IsNull n’était pas été utilisée pour vérifier une valeur Null, une exception serait levée si l’indexeur retournait DBNull.Value et tentait d’effectuer un cast vers une String.

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

DataTable products = ds.Tables["Product"];

var query =
    from product in products.AsEnumerable()
    where !product.IsNull("Color") &&
        (string)product["Color"] == "Red"
    select new
    {
        Name = product["Name"],
        ProductNumber = product["ProductNumber"],
        ListPrice = product["ListPrice"]
    };

foreach (var product in query)
{
    Console.WriteLine("Name: {0}", product.Name);
    Console.WriteLine("Product number: {0}", product.ProductNumber);
    Console.WriteLine("List price: ${0}", product.ListPrice);
    Console.WriteLine("");
}
' 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 products As DataTable = ds.Tables("Product")

Dim query = _
    From product In products.AsEnumerable() _
    Where product!Color IsNot DBNull.Value AndAlso product!Color = "Red" _
    Select New With _
       { _
           .Name = product!Name, _
           .ProductNumber = product!ProductNumber, _
           .ListPrice = product!ListPrice _
       }

For Each product In query
    Console.WriteLine("Name: " & product.Name)
    Console.WriteLine("Product number: " & product.ProductNumber)
    Console.WriteLine("List price: $" & product.ListPrice & vbNewLine)
Next

La méthode Field donne accès aux valeurs de colonne d'un DataRow et le SetField définit les valeurs de colonne dans un DataRow. Les deux méthodes Field et SetField gèrent des types Nullable : vous n’avez pas à vérifier explicitement s’il y a des valeurs Null comme dans l’exemple précédent. Les deux méthodes sont également des méthodes génériques, ce qui fait que vous n’avez pas à effectuer un cast du type de retour.

L'exemple suivant utilise la méthode Field.

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

DataTable products = ds.Tables["Product"];

var query =
    from product in products.AsEnumerable()
    where product.Field<string>("Color") == "Red"
    select new
    {
        Name = product.Field<string>("Name"),
        ProductNumber = product.Field<string>("ProductNumber"),
        ListPrice = product.Field<Decimal>("ListPrice")
    };

foreach (var product in query)
{
    Console.WriteLine("Name: {0}", product.Name);
    Console.WriteLine("Product number: {0}", product.ProductNumber);
    Console.WriteLine("List price: ${0}", product.ListPrice);
    Console.WriteLine("");
}
' 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 products As DataTable = ds.Tables("Product")

Dim query = _
    From product In products.AsEnumerable() _
    Where product.Field(Of String)("Color") = "Red" _
    Select New With _
       { _
           .Name = product.Field(Of String)("Name"), _
           .ProductNumber = product.Field(Of String)("ProductNumber"), _
           .ListPrice = product.Field(Of Decimal)("ListPrice") _
       }

For Each product In query
    Console.WriteLine("Name: " & product.Name)
    Console.WriteLine("Product number: " & product.ProductNumber)
    Console.WriteLine("List price: $ " & product.ListPrice & vbNewLine)
Next

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 exception InvalidCastException est levée. Le nom de la colonne spécifiée doit également correspondre à celui de la colonne dans le DataSet, sinon une ArgumentException est levée. Dans les deux cas, l'exception est levée au moment de l'exécution pendant l'énumération des données lorsque la requête est exécutée.

La méthode SetField n'effectue aucune conversion de type. Toutefois, cela ne signifie pas qu'une conversion de type ne se produira pas. La méthode SetField expose le comportement ADO.NET de la classe DataRow. Une conversion de type pourrait être exécutée par l’objet DataRow et la valeur convertie serait ensuite enregistrée dans l’objet DataRow.

Voir aussi