2012-08-02 76 views
2

我剛剛完成了在讀邁克的真棒教程:http://www.mikesdotnetting.com/Article/150/Web-Pages-Efficient-Paging-Without-The-WebGrid尋呼搜索結果

,我使用SQL CE 4.0與實體F/W ADO.NET和我的搜索查詢是:

foreach(string term in query) 
{ 
     var products = database.Products.Where(p => 
       p.PartNumber.ToLower().Contains(term.ToLower()) || 
       p.PartNumber.ToLower() == term.ToLower() || p.OProductName.ToLower().Contains(term.ToLower()) || p.OProductName.ToLower() == term.ToLower()); 
} 

在Mike的搜索查詢:

sql = "Select Title, ISBN, Description, FirstName, LastName, Category From Books " + 
      "Inner Join Authors on Books.AuthorId = Authors.AuthorId " + 
      "Inner Join Categories on Books.CategoryId = Categories.CategoryId " + 
      "Order By BookId OFFSET @0 ROWS FETCH NEXT @1 ROWS ONLY;"; 

var result = db.Query(sql, offset, pageSize); 

他使用正常的「WebMatrix方式」執行與數據庫的選擇查詢。

讓我卡住的部分是如何在我的查詢版本中編寫他的OFFSET @0 ROWS FETCH NEXT @1 ROWS ONLY;?我如何在EF ado.net中編寫它?

我希望這是有道理的。

+1

非常..好的問題... – naveen 2012-08-02 16:21:03

回答

2

你在找什麼是LINQ方法Skip()Take()。 Skip()允許您跳過記錄 - 查詢的OFFSET @ 0 ROWS部分。 Take()讓您指定要返回的行數 - 查詢的FETCH NEXT @ 1 ROWS ONLY部分。

所以,你的代碼從頁返回每頁的項目,可能是這個樣子:

var products = database.Products.Where(p => 
      p.PartNumber.ToLower().Contains(term.ToLower()) || 
      p.PartNumber.ToLower() == term.ToLower() || p.OProductName.ToLower().Contains(term.ToLower()) || p.OProductName.ToLower() == term.ToLower()) 
      .OrderBy(p => p.PartNumber) 
      .Skip((Page - 1) * PageSize).Take(PageSize); 

編輯:您還需要在跳躍之前的OrderBy()(拋出),因爲只有有序查詢可以跳過。例如,您可能想要按部件號進行訂購。

順便說一下,使用SQL CE 4.0作爲previous versions did not support Skip() in EF!這是件好事!

+0

感謝這麼多。分頁工作 - ish ...只是,它不再返回任何結果。 – Arrow 2012-08-03 12:00:15

3

假設我正確地理解你的問題,你應該使用Skip方法的組合和Take方法:

var query = 
from product in database.Products 
// where product.Property == "some value" // or whatever your where clause is 
select product; 

var queryPage = query.Skip(itemsPerPage * pageIndex).Take(itemsPerPage);