寻呼搜索结果

时间:2012-08-02 16:02:37

标签: c# asp.net .net entity-framework search

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

我希望这是有道理的。

2 个答案:

答案 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!