2012-08-02 55 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);