Metodi generici Field e SetField (LINQ to DataSet)

In LINQ to DataSet sono disponibili metodi di estensione della classe DataRow per l'accesso ai valori di colonna: il metodo Field e il metodo SetField. Questi metodi semplificano l'accesso ai valori di colonna per gli sviluppatori, in particolare per quanto riguarda i valori Null. DataSet usa DBNull.Value per rappresentare i valori Null, mentre LINQ usa i tipi Nullable e Nullable<T>. L'utilizzo della funzione di accesso della colonna preesistente in DataRow richiede di eseguire il cast dell'oggetto restituito nel tipo appropriato. Se un determinato campo in DataRow può essere Null, è necessario verificare in modo esplicito la presenza di un valore Null, perché se viene restituito DBNull.Value e ne viene eseguito il cast in modo implicito in un altro tipo, verrà generata un'eccezione InvalidCastException. Nell'esempio seguente, se non viene usato il metodo DataRow.IsNull per verificare la presenza di un valore Null, verrà generata un'eccezione nel caso l'indicizzatore restituisca DBNull.Value e tenti di eseguirne il cast in 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

Il metodo Field fornisce l'accesso ai valori di colonna di DataRow e SetField imposta i valori di colonna in DataRow. Poiché i metodi Field e SetField gestiscono tipi di valore che ammettono i valori Null, non è necessario verificare in modo esplicito la presenza di valori Null, a differenza dell'esempio precedente. Entrambi metodi sono inoltre generici, quindi non è necessario eseguire i cast del tipo restituito.

Nell'esempio seguente viene usato il metodo 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

Si noti che il tipo di dati specificato nel parametro T generico del metodo Field e del metodo SetField deve corrispondere al tipo del valore sottostante. In caso contrario, verrà generata un'eccezione InvalidCastException. Il nome di colonna specificato deve inoltre corrispondere al nome di una colonna presente in DataSet; in caso contrario, verrà generata un'eccezione ArgumentException. In entrambi casi, l'eccezione viene generata in fase di esecuzione durante l'enumerazione dei dati quando viene eseguita la query.

Il metodo SetField non esegue alcun tipo di conversione. Tuttavia, ciò non significa che non verrà eseguita una conversione del tipo. Il metodo SetField espone il comportamento ADO.NET della classe DataRow. È possibile eseguire una conversione del tipo tramite l'oggetto DataRow e salvare quindi il valore convertito nell'oggetto DataRow.

Vedi anche