Compartir a través de


Métodos genéricos Field y SetField (LINQ to DataSet)

LINQ to DataSet proporciona métodos de extensión a la clase DataRow para obtener acceso a los valores de columna: el método Field y el método SetField. Estos métodos facilitan el acceso a los valores de columna a los desarrolladores, sobre todo en lo relativo a valores NULL. DataSet utiliza Value para representar valores NULL, en tanto que LINQ utiliza la compatibilidad con tipos que admiten valores NULL introducida en .NET Framework 2.0. Utilizar el descriptor de acceso de columna preexistente en DataRow exige convertir el objeto de valor devuelto al tipo apropiado. Si un campo determinado de DataRow puede ser NULL, se debe comprobar de manera explícita si hay un valor NULL porque la devolución de Value y su conversión implícita a otro tipo produce una InvalidCastException. En el ejemplo siguiente, si no se utilizara el método IsNull para comprobar si hay un valor NULL, se produciría una excepción si el indizador devolviera Value e intentara convertirlo en 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("");
}

El método Field proporciona acceso a los valores de columna de DataRow y SetField establece los valores de columna en DataRow. Tanto el método Field como el método SetField controlan tipos que admiten valores NULL, por lo que no es necesario comprobar explícitamente si hay valores NULL, como en el ejemplo anterior. Además, ambos son métodos genéricos, lo que significa que no es necesario convertir el tipo de valor devuelto.

El siguiente ejemplo utiliza el método 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("");
}

Observe que el tipo de datos especificado en el parámetro T genérico de los métodos Field y SetField deben coincidir con el tipo del valor subyacente. De lo contrario, se producirá una excepción InvalidCastException. El nombre de columna especificado debe también coincidir con el nombre de una columna en DataSet; en caso contrario, se producirá una ArgumentException. En ambos casos, la excepción se produce en tiempo de ejecución durante la enumeración de datos cuando se ejecuta la consulta.

El método SetField en sí no realiza ninguna conversión de tipos. Sin embargo, esto no significa que no se realizará una conversión de tipos. El método SetField expone el comportamiento ADO.NET 2.0 de la clase DataRow. El objeto DataRow consiguió realizar una conversión de tipos y el valor convertido se guardará en el objeto DataRow.

Vea también

Referencia

DataRowExtensions