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

LINQ to DataSet proporciona métodos de extensión a la clase DataRow para tener acceso a los valores de columna: el método Field y el método SetField.LINQ to DataSet provides extension methods to the DataRow class for accessing column values: the Field method and the SetField method. Estos métodos facilitan el acceso a los valores de columna a los desarrolladores, sobre todo en lo relativo a valores NULL.These methods provide easier access to column values for developers, especially regarding null values. El DataSet usa DBNull.Value para representar valores NULL, mientras que LINQ usa los tipos Nullable y Nullable<T>.The DataSet uses DBNull.Value to represent null values, whereas LINQ uses the Nullable and Nullable<T> types. Usar el descriptor de acceso de columna preexistente en DataRow requiere que se convierta el objeto devuelto al tipo adecuado.Using the pre-existing column accessor in DataRow requires you to cast the return object to the appropriate type. Si un campo determinado de una DataRow puede ser null, debe comprobar explícitamente si hay un valor null, ya que devolver DBNull.Value y convertirlo implícitamente a otro tipo produce una InvalidCastException.If a particular field in a DataRow can be null, you must explicitly check for a null value because returning DBNull.Value and implicitly casting it to another type throws an InvalidCastException. En el ejemplo siguiente, si el método DataRow.IsNull no se usó para comprobar si hay un valor null, se produciría una excepción si el indexador devolviera DBNull.Value e intentó convertirlo en un String.In the following example, if the DataRow.IsNull method was not used to check for a null value, an exception would be thrown if the indexer returned DBNull.Value and tried to cast it to a 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

El método Field proporciona acceso a los valores de columna de DataRow y SetField establece los valores de columna en DataRow.The Field method provides access to the column values of a DataRow and the SetField sets column values in a 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.Both the Field method and SetField method handle nullable types, so you do not have to explicitly check for null values as in the previous example. Además, ambos son métodos genéricos, lo que significa que no es necesario convertir el tipo de valor devuelto.Both methods are generic methods, also, so you do not have to cast the return type.

El siguiente ejemplo utiliza el método Field.The following example uses the Field method.

// 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

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.Note that the data type specified in the generic parameter T of the Field method and the SetField method must match the type of the underlying value. De lo contrario, se producirá una excepción InvalidCastException.Otherwise, an InvalidCastException exception will be thrown. El nombre de columna especificado debe también coincidir con el nombre de una columna en DataSet; en caso contrario, se producirá una ArgumentException.The specified column name must also match the name of a column in the DataSet, or an ArgumentException will be thrown. En ambos casos, la excepción se produce en tiempo de ejecución durante la enumeración de datos cuando se ejecuta la consulta.In both cases, the exception is thrown at run time during the enumeration of the data when the query is executed.

El método SetField en sí no realiza ninguna conversión de tipos.The SetField method itself does not perform any type conversions. Sin embargo, esto no significa que no se realizará una conversión de tipos.This does not mean, however, that a type conversion will not occur. El método SetField expone el comportamiento ADO.NET de la clase DataRow.The SetField method exposes the ADO.NET behavior of the DataRow class. El objeto DataRow puede realizar una conversión de tipos y el valor convertido se guardaría en el objeto DataRow.A type conversion could be performed by the DataRow object and the converted value would then be saved to the DataRow object.

Vea tambiénSee also