次の方法で共有


クエリの結果をページングする方法 (Entity Framework)

このトピックでは、クエリ結果をページングする方法について説明します。この例では、クエリ結果で Product.ListPrice の順に並べられている Product オブジェクトのうち、最初の 3 個をスキップし、次の 5 個を取得します。次の各 Entity Framework クエリ テクノロジを使って同じことを行う例が紹介されています。

  • LINQ to Entities

  • Entity SQL と ObjectQuery<T>

  • ObjectQuery<T> のクエリ ビルダ メソッド

このトピックの例には、Adventure Works Sales Model が使用されています。この例のコードを実行するには、あらかじめプロジェクトに AdventureWorks Sales Model を追加し、エンティティ フレームワーク が使用されるようにプロジェクトを構成しておく必要があります。具体的な方法については、「Entity Framework プロジェクトを手動で構成する方法」と「Entity Data Model を手動で定義する方法 (Entity Framework)」の手順を参照してください。Entity Data Model ウィザードを使用して、AdventureWorks Sales Model を定義することもできます。詳細については、「Entity Data Model ウィザードを使用する方法 (Entity Framework)」を参照してください。

これは、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 の使用 (Entity Framework タスク)
How to: Execute an Entity SQL Query Using EntityCommand