Compartilhar via


Consultas de tabela única (LINQ to DataSet)

as consultas LINQ (consulta Language-Integrated) 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 AsEnumerable método se quiser usar DataTable como origem na cláusula From de uma consulta LINQ.

O exemplo a seguir obtém todos os pedidos online da tabela SalesOrderHeader e gera a 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: {onlineOrder.SalesOrderID} Order date: {onlineOrder.OrderDate:d} Order number: {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 variável local `query` é inicializada com uma expressão de consulta, que opera em uma ou mais fontes de informações aplicando um ou mais operadores de consulta dos operadores de consulta padrão ou, no caso de LINQ to DataSet, operadores específicos à classe DataSet. A expressão de consulta no exemplo anterior usa dois dos operadores de consulta padrão: Where e Select.

A cláusula Where filtra a sequência com base em uma condição, nesse caso, quando OnlineOrderFlag é configurado para 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, OrderDatee SalesOrderNumber. Os valores dessas três propriedades são definidos com base nos valores das colunas SalesOrderID, OrderDate e SalesOrderNumber da tabela SalesOrderHeader.

O loop então enumera o objeto enumerável retornado por foreach e gera os resultados da consulta. Como a consulta é um tipo Enumerable, que implementa IEnumerable<T>, a avaliação da consulta é adiada até que a variável de consulta seja iterada usando o loop foreach. A avaliação de consulta adiada permite que as consultas sejam mantidas como valores que podem ser avaliados várias vezes, cada vez gerando 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 DataRow. Tanto o método Field quanto o método SetField manipulam tipos de valor anuláveis, portanto, você não precisa verificar explicitamente valores nulos. Ambos os métodos são genéricos, o que significa que você não precisa especificar o tipo de retorno. Você pode 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ê precisará verificar se o valor é nulo usando o IsNull método. Para obter mais informações, consulte Métodos de Campo Genérico e SetField.

Observe que o tipo de dados especificado no parâmetro T genérico do método Field e do método SetField deve corresponder ao tipo do valor subjacente ou um InvalidCastException será lançado. O nome da coluna especificado também deve corresponder ao nome de uma coluna no DataSet ou, caso contrário, um ArgumentException será lançado. Em ambos os casos, a exceção é gerada na enumeração de dados de runtime quando a consulta é executada.

Consulte também