Méthodes génériques Field et SetField (LINQ to DataSet)
Mise à jour : November 2007
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 Value pour représenter les valeurs Null, alors que LINQ utilise la prise en charge de type nullable introduite dans .NET Framework 2.0. Pour pouvoir utiliser l'accesseur de colonne existant dans DataRow, vous devez effectuer un cast de l'objet de retour vers le type approprié. Si un champ particulier d'un DataRow peut avoir la valeur Null, vous devez vérifier explicitement une valeur Null parce que le fait de retourner une Value et d'effectuer implicitement un cast vers un autre type lève une InvalidCastException. Dans l'exemple suivant, si la méthode IsNull n'était pas été utilisée pour vérifier une valeur Null, une exception serait levée si l'indexeur retournait une Value et tentait d'effectuer un cast vers une String.
' 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
// 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("");
}
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 nullables, ce qui fait que vous n'avez pas à vérifier explicitement les 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.
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
// 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("");
}
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 2.0 de la classe DataRow. Une conversion de type pourrait être exécutée par l'objet DataRow et la valeur convertie serait enregistrée ensuite sur l'objet DataRow.