2013-03-05 81 views
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查询?

+0

站内搜索:LINQ之间,你会得到大量的例子。 http://stackoverflow.com/questions/7235859/linq-expression-for-executing-a-between – JeffO 2013-03-05 13:45:51

回答

3

如果你想要做一个简单的页面,这里有一个快速的解决方案:

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

带有EF输入的+1应该排序为跳过 – 2013-03-05 13:54:39

+1

是的,我了解了它前段时间很难;) – 2013-03-05 13:58:23

1

使用会同跳过()方法采取

var books = bookContext.Books.OrderBy(b => b.Id).Skip(pageNumber * numberOfBooksOnPage).Take(numberOfBooksOnPage) 
+0

跳过使用无序查询? – 2013-03-05 13:50:24

+0

是的,因为所有序列都有一些顺序,但是您需要明确指定一个顺序以确保您按照您感兴趣的顺序获取数据。 – 2013-03-05 14:01:36

1

你想Skip -

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

在LINQ中寻呼通常涉及使用SkipTake个扩展,因此:

var numOfBooksPerPage = 20; 
var currPage = 3; 

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

至于说,如果你想你的页面结果,最好使用采取一起跳过如前面的答案。 Linq to sql没有公开之间的方法,这个可以很容易地用代替这里子句。另外,您可以编写自己的扩展方法:

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