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 se implementa en ninguna de estas interfaces, por lo que se debe llamar al método AsEnumerable si desea utilizar DataTable como un origen en la cláusula From de una consulta de LINQ.

En el ejemplo siguiente se obtienen todos los pedidos en línea desde la tabla SalesOrderHeader y se envían los resultados de id., fecha y número de pedido a 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: {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

La consulta variable local se inicializa con una expresión de consulta, la cual opera en uno o varios orígenes de información aplicando uno o varios operadores de consulta desde el operador estándar de consulta o, en el caso de LINQ to DataSet, desde el operador específico de la clase DataSet. La expresión de consulta del ejemplo anterior utiliza dos de los operadores estándar de consulta: Where y Select.

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

A continuación, el bucle foreach enumera el objeto enumerable devuelto por Select y produce 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 la consulta en diferido permite que éstas se mantengan como valores que se pueden evaluar varias veces, y cada vez produciendo resultados potencialmente diferentes.

El método Field proporciona acceso a los valores de columna de DataRow y SetField (que no se mostraba en el ejemplo anterior) establece los valores de columna en DataRow. Tanto el método Field como el método SetField controlan tipos de valor que admiten valores NULL, por lo que no es necesario comprobar explícitamente si hay valores NULL. 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 admite valores NULL, debe comprobar si el valor es NULL mediante el método IsNull. Para más información, consulte Métodos genéricos Field y SetField.

Observe que el tipo de datos especificado en el parámetro T genérico de los métodos Field y SetField deben coincidir con el tipo del valor subyacente; en caso contrario, se producirá una InvalidCastException. El nombre de columna especificado debe también coincidir con el nombre de una columna en DataSet, en caso contrario, se producirá una ArgumentException. En ambos casos, la excepción se produce en tiempo de ejecución de enumeración de datos, cuando se ejecuta la consulta.

Consulte también