Compartir a través de


Consultas de tabla única (LINQ to DataSet)

Las consultas de Language Integrated Query (LINQ) funcionan en orígenes de datos que implementan la interfaz IEnumerable<T> o IQueryable<T>. La clase DataTable no implementa ninguna interfaz, por lo que debe llamar al método AsEnumerable si desea usar el DataTable como origen en la cláusula From de una consulta LINQ.

En el ejemplo siguiente se obtienen todos los pedidos en línea de la tabla SalesOrderHeader y se genera el identificador de pedido, la fecha de pedido y el número de pedido en la consola.

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

La variable local query se inicializa con una expresión de consulta, que opera sobre uno o más fuentes de información, aplicando uno o más operadores de consulta de los operadores de consulta estándar o, en el caso de LINQ to DataSet, operadores específicos de la clase DataSet. La expresión de consulta del ejemplo anterior usa dos de los operadores de consulta estándar: Where y Select.

La cláusula Where filtra la secuencia en función de una condición, en este caso, que OnlineOrderFlag esté definido como true. El Select operador asigna y devuelve un objeto enumerable que captura los argumentos pasados al operador. En este ejemplo anterior, se crea un tipo anónimo con tres propiedades: SalesOrderID, OrderDatey SalesOrderNumber. Los valores de estas tres propiedades se establecen a los valores de las columnas SalesOrderID, OrderDate, y SalesOrderNumber de la tabla SalesOrderHeader.

El bucle foreach enumera el objeto enumerable devuelto por Select y arroja los resultados de la consulta. Dado que una consulta es un tipo Enumerable, que implementa IEnumerable<T>, la evaluación de la consulta se difiere hasta que se procesa una iteración en la variable de la consulta mediante el bucle foreach. La evaluación de consultas diferida permite mantener las consultas como valores que se pueden evaluar varias veces, cada vez que se producen resultados potencialmente diferentes.

El Field método proporciona acceso a los valores de columna de DataRow y SetField (no se muestra en el ejemplo anterior) establece valores de columna en un DataRow. Tanto el método Field como el método SetField manejan tipos de valor anulables, por lo que no es necesario comprobar de manera explícita si hay valores nulos. Además, ambos son métodos genéricos, lo que significa que no es necesario convertir el tipo de valor devuelto. Puede utilizar el descriptor de acceso de columna preexistente en DataRow (por ejemplo, o["OrderDate"]), pero hacerlo le exigiría convertir el objeto de valor devuelto al tipo apropiado. Si la columna es un tipo de valor anulable, debe comprobar si el valor es NULL mediante el método IsNull. Para obtener más información, consulte los métodos genéricos Field y SetField.

Tenga en cuenta que el tipo de datos especificado en el parámetro genérico T del método Field y del método SetField debe coincidir con el tipo del valor subyacente o se producirá una excepción InvalidCastException. El nombre de columna especificado debe coincidir con el nombre de una columna en DataSet, de lo contrario, se lanzará una ArgumentException. En ambos casos, la excepción se produce en la enumeración de datos en tiempo de ejecución cuando se ejecuta la consulta.

Consulte también