如何:对查询结果分页(实体框架)

本主题介绍如何对查询结果分页。本示例先跳过查询结果(按 Product.ListPrice 排序)中的前三个 Product 对象,然后获取五个对象。将使用以下每种实体框架查询技术说明同一示例:

  • LINQ to Entities

  • Entity SQL with ObjectQuery<T>

  • ObjectQuery <T> 的查询生成器方法

本主题中的示例基于 Adventure Works 销售模型。若要运行本示例中的代码,必须已将 AdventureWorks 销售模型添加到您的项目中,并将项目配置为使用 实体框架。为此,请完成如何:手动配置实体框架项目如何:手动定义实体数据模型(实体框架) 中的过程。也可以使用实体数据模型向导定义 AdventureWorks 销售模型。有关更多信息,请参见如何:使用实体数据模型向导(实体框架)

示例

这是 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);
    }
}

这是 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());
    }
}

这是查询生成器方法示例。

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());
    }
}

另请参见

参考

SKIP (Entity SQL)
LIMIT (Entity SQL)
Skip
Top

概念

分页 (Entity SQL)
Entity SQL 语言

其他资源

使用 EntityClient(实体框架任务)
How to: Execute an Entity SQL Query Using EntityCommand