您好我最近学习了实体框架和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查询中表示存储过程中写入的内容?
答案 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中的分页通常涉及使用Skip
和Take
扩展名,因此:
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);
}