2013-03-05 122 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); 
}