0

こんにちは私は最近エンティティフレームワークとlinqを学び、このストアドプロシージャを変換するように求められました。

CREATE PROCEDURE [dbo].[GetBooks]
@numberOfBooksOnPage int,
@pageNumber int
    AS
    BEGIN

    WITH AllBooks AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowId,
        Id , Name , Author , Description , PublicationDate , CategoryId
        FROM Books
    )

    SELECT Id , Name , Author , Description , PublicationDate , CategoryId
    FROM AllBooks
    WHERE RowId BETWEEN ((@pageNumber - 1) * @numberOfBooksOnPage) + 1 AND @pageNumber * @numberOfBooksOnPage
    ORDER BY RowID
    END

これまでのところ、ページごとに表示される本の総数を取得することしかできませんでしたが、pageNumberを介して本を取得する方法を見つける必要があります。

これは私がこれまでに持っているものです:

var books = bookContext.Books.Take(numberOfBooksOnPage);

では、linqクエリのストアドプロシージャに記述されている内容をどのように表すことができますか?

4

5 に答える 5

3

簡単なページングを行いたい場合は、次の簡単な解決策があります。

var books = bookContext.Books.OrderBy(x => x.Id).Skip(pageNo*booksPerPage).Take(booksPerPage);
于 2013-03-05T13:43:53.337 に答える
1

LINQ でのページングには、通常、拡張機能SkipTake拡張機能が使用されるため、次のようになります。

var numOfBooksPerPage = 20;
var currPage = 3;

var books = bookContext.Books.Skip(currPage * numOfBooksPerPage).Take(numOfBooksPerPage);
于 2013-03-05T13:44:37.543 に答える
1

前述のように、結果をページングする場合は、前の回答のようにTakeをSkipと組み合わせて使用​​することをお勧めします。Linq to sql はBetweenメソッドを公開していません。これはWhere句に簡単に置き換えることができます。または、独自の拡張メソッドを作成することもできます。

public static IEnumerable<TSource> Between<TSource, TResult>
(
    this IEnumerable<TSource> source, Func<TSource, TResult> selector,
    TResult lowest, TResult highest
)
    where TResult : IComparable<TResult>
{
    return source.OrderBy(selector).
        SkipWhile(s => selector.Invoke(s).CompareTo(lowest) < 0).
        TakeWhile(s => selector.Invoke(s).CompareTo(highest) <= 0 );
}

そして試してみてください:

public class Book
{
    public string Name { get; set; }
    public int Pages { get; set; }
}    

[Test]
public void TestBooks()
{
    var listOfNumbers = new List<Book>() {new Book(){Pages = 10}, new Book(){Pages = 44}};
    var result = listOfNumbers.Between(x => x.Pages, 0, 29);
}
于 2013-03-05T14:01:05.453 に答える
1

take と組み合わせて Skip() メソッドを使用する

var books = bookContext.Books.OrderBy(b => b.Id).Skip(pageNumber * numberOfBooksOnPage).Take(numberOfBooksOnPage)
于 2013-03-05T13:43:40.473 に答える
1

スキップしたい-

var books = bookContext.Books.OrderBy(b => b.someField).Skip(pageNumber * numberOfBooksOnPage).Take(numberOfBooksOnPage);
于 2013-03-05T13:44:01.010 に答える