我刚刚在http://www.mikesdotnetting.com/Article/150/Web-Pages-Efficient-Paging-Without-The-WebGrid
阅读了Mike的精彩教程我正在使用SQL CE 4.0和Entity 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中编写它?
我希望这是有道理的。
答案 0 :(得分: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);
答案 1 :(得分:2)
您正在寻找的是LINQ方法Skip()和Take()。 Skip()允许您跳过记录 - 查询的OFFSET @ 0 ROWS部分。 Take()允许您指定要返回的行数 - 查询的FETCH NEXT @ 1 ROWS ONLY部分。
因此,从页面页面返回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是一件好事,previous versions did not support Skip() in EF!!