Consultas de tabela única (LINQ to DataSet)
As consultas LINQ (Language-Integrated Query) funcionam em fontes de dados que implementam a IEnumerable<T> interface ou a IQueryable<T> interface. A DataTable classe não implementa nenhuma das interfaces, portanto, você deve chamar o AsEnumerable método se quiser usar o DataTable como fonte na From
cláusula de uma consulta LINQ.
O exemplo a seguir obtém todos os pedidos online da tabela SalesOrderHeader e envia o ID do pedido, a data do pedido e o número do pedido para o console.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable orders = ds.Tables["SalesOrderHeader"];
var query =
from order in orders.AsEnumerable()
where order.Field<bool>("OnlineOrderFlag") == true
select new
{
SalesOrderID = order.Field<int>("SalesOrderID"),
OrderDate = order.Field<DateTime>("OrderDate"),
SalesOrderNumber = order.Field<string>("SalesOrderNumber")
};
foreach (var onlineOrder in query)
{
Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",
onlineOrder.SalesOrderID,
onlineOrder.OrderDate,
onlineOrder.SalesOrderNumber);
}
' 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 orders As DataTable = ds.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
Select New With { _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
}
For Each onlineOrder In query
Console.Write("Order ID: " & onlineOrder.SalesOrderID)
Console.Write(" Order date: " & onlineOrder.OrderDate)
Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next
A consulta da variável local é inicializada com uma expressão de consulta, que opera em uma ou mais fontes de informação aplicando um ou mais operadores de consulta dos operadores de consulta padrão ou, no caso do LINQ to DataSet, operadores específicos para a DataSet classe. A expressão de consulta no exemplo anterior usa dois dos operadores de consulta padrão: Where
e Select
.
A Where
cláusula filtra a sequência com base em uma condição, neste caso que o OnlineOrderFlag
é definido como true
. O Select
operador aloca e retorna um objeto enumerável que captura os argumentos passados para o operador. Neste exemplo acima, um tipo anônimo é criado com três propriedades: SalesOrderID
, OrderDate
e SalesOrderNumber
. Os valores dessas três propriedades são definidos como os valores das SalesOrderID
colunas , OrderDate
e SalesOrderNumber
da SalesOrderHeader
tabela.
Em foreach
seguida, o loop enumera o objeto enumerável retornado por Select
e produz os resultados da consulta. Como a consulta é um Enumerable tipo que implementa IEnumerable<T>o , a avaliação da consulta é adiada até que a variável de consulta seja iterada usando o foreach
loop. A avaliação de consulta adiada permite que as consultas sejam mantidas como valores que podem ser avaliados várias vezes, cada vez produzindo resultados potencialmente diferentes.
O Field método fornece acesso aos valores de coluna de a DataRow e o SetField (não mostrado no exemplo anterior) define valores de coluna em um DataRowarquivo . O método e o Field método manipulam SetField tipos de valor anuláveis, portanto, você não precisa verificar explicitamente se há valores nulos. Ambos os métodos são métodos genéricos, também, o que significa que você não precisa converter o tipo de retorno. Você poderia usar o acessador de coluna pré-existente em DataRow (por exemplo, o["OrderDate"]
), mas isso exigiria que você convertesse o objeto de retorno para o tipo apropriado. Se a coluna for um tipo de valor anulável, você terá que verificar se o valor é nulo usando o IsNull método. Para obter mais informações, consulte Métodos Generic Field e SetField.
Observe que o tipo de dados especificado no parâmetro T
genérico do método e SetField do Field método deve corresponder ao tipo do valor subjacente ou um InvalidCastException será lançado. 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 na enumeração de dados em tempo de execução quando a consulta é executada.