2

我刚刚读完 Mike 的精彩教程: http: //www.mikesdotnetting.com/Article/150/Web-Pages-Efficient-Paging-Without-The-WebGrid

我正在使用带有实体 F/W ADO.NET 的 SQL CE 4.0,我的搜索查询是:

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 中编写它?

我希望这是有道理的。

4

2 回答 2

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);
于 2012-08-02T16:19:14.463 回答
2

您正在寻找的是 LINQ 方法Skip()Take()。Skip() 允许您跳过记录 - 查询的 OFFSET @0 ROWS 部分。Take() 允许您指定要返回的行数 - 查询的 FETCH NEXT @1 ROWS ONLY 部分。

因此,您从页面 Page 返回 PageSize 项目的代码可能如下所示:

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

编辑:您还需要在 Skip() 之前输入 OrderBy(),因为只能跳过有序查询。例如,您可能希望按零件号订购。

顺便说一句,使用 SQL CE 4.0 是件好事,因为以前的版本不支持 EF 中的 Skip()!

于 2012-08-02T16:18:50.920 回答