Campo genérico e métodos de SetField (LINQ to DataSet)

LINQ to DataSet fornece métodos de extensão para a classe DataRow para acessar valores de coluna: o método Field e o método SetField. Esses métodos fornecem acesso mais fácil a valores de coluna para desenvolvedores, especialmente em relação a valores nulos. O DataSet usa DBNull.Value para representar valores nulos, enquanto LINQ usa e os tipos Nullable e Nullable<T>. Usar o acessador pré-existente de coluna em DataRow exige que você converta o objeto de retorno para o tipo apropriado. Se um campo específico em um DataRow pode ser nulo, você deverá explicitamente verificar um valor nulo porque retornar DBNull.Value e implicitamente convertê-lo para um outro tipo gera um InvalidCastException. No exemplo a seguir, se o método DataRow.IsNull não foi usado para verificar um valor nulo, uma exceção será gerada se o indexador tiver retornado DBNull.Value e tentou convertê-lo para 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

O método Field fornece acesso aos valores de coluna de um DataRow e o SetField define valores de coluna em um DataRow. Os métodos Field e SetField lidam com tipos anuláveis de valores, para você não precise verificar valores nulos explicitamente como no exemplo anterior. Ambos os métodos também são genéricos, de modo que você não tem que converter o tipo de retorno.

O exemplo a seguir usa o método 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

Observe que o tipo de dados especificado no parâmetro genérico T dos métodos Field e SetField deve corresponder ao tipo do valor subjacente. Caso contrário, uma exceção InvalidCastException será gerada. O nome da coluna especificado também deve corresponder ao nome de uma coluna no DataSet ou ArgumentException será gerado. Em ambos os casos, a exceção é gerada em tempo de execução durante a enumeração dos dados quando a consulta é executada.

O próprio método SetField não realiza nenhuma conversão de tipos. Isso não significa, entretanto, que uma conversão de tipos não ocorrerá. O método SetField expõe o comportamento de ADO.NET da classe DataRow. Uma conversão de tipos pode ser realizada pelo objeto DataRow e o valor convertido seria salvo no objeto DataRow.

Confira também