从特定数量的值之间的数据库中获取项目

时间:2013-03-05 13:41:01

标签: c# linq linq-to-entities

您好我最近学习了实体框架和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查询中表示存储过程中写入的内容?

5 个答案:

答案 0 :(得分:3)

如果您想进行简单的分页,这是一个快速的解决方案:

var books = bookContext.Books.OrderBy(x => x.Id).Skip(pageNo*booksPerPage).Take(booksPerPage);

答案 1 :(得分:1)

将Skip()方法与take

结合使用
var books = bookContext.Books.OrderBy(b => b.Id).Skip(pageNumber * numberOfBooksOnPage).Take(numberOfBooksOnPage)

答案 2 :(得分:1)

你想要Skip -

var books = bookContext.Books.OrderBy(b => b.someField).Skip(pageNumber * numberOfBooksOnPage).Take(numberOfBooksOnPage);

答案 3 :(得分:1)

LINQ中的分页通常涉及使用SkipTake扩展名,因此:

var numOfBooksPerPage = 20;
var currPage = 3;

var books = bookContext.Books.Skip(currPage * numOfBooksPerPage).Take(numOfBooksPerPage);

答案 4 :(得分: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);
}