Métodos Generic Field e SetField (LINQ to DataSet)
LINQ to DataSet fornece métodos de extensão para a DataRow classe para acessar valores de coluna: o Field método e o SetField método. 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 o LINQ usa o Nullable e Nullable<T> types. O uso do acessador de coluna pré-existente em DataRow requer que você converta o objeto de retorno para o tipo apropriado. Se um campo específico em um DataRow pode ser nulo, você deve verificar explicitamente se há um valor nulo porque retornar DBNull.Value e implicitamente convertê-lo para outro tipo lança um InvalidCastException. No exemplo a seguir, se o DataRow.IsNull método não foi usado para verificar um valor nulo, uma exceção seria lançada se o indexador retornasse DBNull.Value e tentasse convertê-lo em um Stringarquivo .
// 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 Field método fornece acesso aos valores de coluna de a DataRow e os SetField conjuntos de valores de coluna em um DataRowarquivo . O método e SetField o Field método manipulam tipos de valor anuláveis, portanto, você não precisa verificar explicitamente se há valores nulos como no exemplo anterior. Ambos os métodos são métodos genéricos, também, para que você não precise converter o tipo de retorno.
O exemplo a seguir usa o Field método.
// 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 T
genérico do método e o Field SetField método devem corresponder ao tipo do valor subjacente. Caso contrário, uma InvalidCastException exceção será lançada. O nome da coluna especificada também deve corresponder ao nome de uma coluna no DataSet, ou um ArgumentException será lançado. Em ambos os casos, a exceção é lançada em tempo de execução durante a enumeração dos dados quando a consulta é executada.
O SetField método em si não executa nenhuma conversão de tipo. Isso não significa, no entanto, que uma conversão de tipo não ocorrerá. O SetField método expõe o comportamento ADO.NET da DataRow classe. Uma conversão de tipo poderia ser executada DataRow pelo objeto e o valor convertido seria salvo no DataRow objeto.