Cómo paginar a través de los resultados de una consulta (Entity Framework)
En este tema se describe cómo paginar los resultados de una consulta. En el ejemplo se obtienen cinco objetos Product después de omitir los primeros tres de los resultados de la consulta, que están ordenados por Product.ListPrice. Se muestra el mismo ejemplo con cada una de las siguientes tecnologías de consulta de Entity Framework:
LINQ to Entities
Entity SQL con ObjectQuery<T>
Métodos del generador de consultas de ObjectQuery<T>
El ejemplo de este tema se basa en el modelo AdventureWorks Sales. Para ejecutar el código de este ejemplo, debe haber agregado ya el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para usar Entity Framework. Para ello, complete los procedimientos de Cómo configurar manualmente un proyecto de Entity Framework y Cómo definir manualmente un modelo Entity Data Model (Entity Framework). También puede utilizar el Asistente para Entity Data Model con el fin de definir el modelo AdventureWorks Sales. Para obtener más información, vea Cómo usar el Asistente para Entity Data Model (Entity Framework).
Ejemplo
Éste es el ejemplo de LINQ to Entities.
Using AWEntities As New AdventureWorksEntities
'LINQ to Entities only supports Skip on ordered collections.
Dim products As IOrderedQueryable(Of Product) = _
AWEntities.Product.OrderBy(Function(p) p.ListPrice)
Dim allButFirst3Products As IQueryable(Of Product) = products.Skip(3)
Console.WriteLine("All but first 3 products:")
For Each product As Product In allButFirst3Products
Console.WriteLine("Name: {0} \t ID: {1}", _
product.Name, _
product.ProductID)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
// LINQ to Entities only supports Skip on ordered collections.
IOrderedQueryable<Product> products = AWEntities.Product
.OrderBy(p => p.ListPrice);
IQueryable<Product> allButFirst3Products = products.Skip(3);
Console.WriteLine("All but first 3 products:");
foreach (Product product in allButFirst3Products)
{
Console.WriteLine("Name: {0} \t ID: {1}",
product.Name,
product.ProductID);
}
}
Éste es el ejemplo de Entity SQL.
Using advWorksContext As New AdventureWorksEntities()
' Define the parameters used to define the "page" of returned data.
Try
' Create a query that takes two parameters.
Dim esqlQuery As String = "SELECT VALUE product FROM " & _
" AdventureWorksEntities.Product AS product " & _
" order by product.ListPrice SKIP @skip LIMIT @limit"
Dim productQuery As New ObjectQuery(Of Product)(esqlQuery, advWorksContext)
' Add parameters to the collection.
productQuery.Parameters.Add(New ObjectParameter("skip", 3))
productQuery.Parameters.Add(New ObjectParameter("limit", 5))
' Iterate through the page of Product items.
For Each result As Product In productQuery
Console.WriteLine("ID: {0} Name: {1}", _
result.ProductID, result.Name)
Next
Catch ex As EntityException
Console.WriteLine(ex.ToString())
Catch ex As InvalidOperationException
Console.WriteLine(ex.ToString())
End Try
End Using
using (AdventureWorksEntities advWorksContext =
new AdventureWorksEntities())
{
try
{
// Create a query that takes two parameters.
string queryString =
@"SELECT VALUE product FROM
AdventureWorksEntities.Product AS product
order by product.ListPrice SKIP @skip LIMIT @limit";
ObjectQuery<Product> productQuery =
new ObjectQuery<Product>(queryString, advWorksContext);
// Add parameters to the collection.
productQuery.Parameters.Add(new ObjectParameter("skip", 3));
productQuery.Parameters.Add(new ObjectParameter("limit", 5));
// Iterate through the collection of Contact items.
foreach (Product result in productQuery)
Console.WriteLine("ID: {0}; Name: {1}",
result.ProductID, result.Name);
}
catch (EntityException ex)
{
Console.WriteLine(ex.ToString());
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
}
A continuación se muestra el ejemplo del método del generador de consultas.
Using advWorksContext As New AdventureWorksEntities()
' Define the parameters used to define the "page" of returned data.
Dim skipValue As Integer = 3
Dim limitValue As Integer = 5
Try
' Define a query that returns a "page" or the full
' Product data using the Skip and Top methods.
' When Top() follows Skip(), it acts like the LIMIT statement.
Dim query As ObjectQuery(Of Product) = advWorksContext.Product _
.Skip("it.ListPrice", "@skip", _
New ObjectParameter("skip", skipValue)) _
.Top("@limit", New ObjectParameter("limit", limitValue))
' Iterate through the page of Product items.
For Each result As Product In query
Console.WriteLine("ID:{0} Name: {1}", _
result.ProductID, result.Name)
Next
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
using (AdventureWorksEntities advWorksContext =
new AdventureWorksEntities())
{
// Define the parameters used to define the "page" of returned data.
int skipValue = 3;
int limitValue = 5;
try
{
// Define a query that returns a "page" or the full
// Product data using the Skip and Top methods.
// When Top() follows Skip(), it acts like the LIMIT statement.
ObjectQuery<Product> query = advWorksContext.Product
.Skip("it.ListPrice","@skip",
new ObjectParameter("skip", skipValue))
.Top("@limit", new ObjectParameter("limit", limitValue));
// Iterate through the page of Product items.
foreach (Product result in query)
Console.WriteLine("ID: {0}; Name: {1}",
result.ProductID, result.Name);
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}
Vea también
Referencia
SKIP (Entity SQL)
LIMIT (Entity SQL)
Skip
Top
Conceptos
Paginación (Entity SQL)
Lenguaje Entity SQL
Otros recursos
Trabajar con EntityClient (tareas de Entity Framework)
How to: Execute an Entity SQL Query Using EntityCommand