使用LINQ优化搜索结果

本文关键字:搜索结果 优化 LINQ 使用 | 更新日期: 2023-09-27 17:52:37

我有一个使用分页的搜索。我的查询带来更多的结果,然后我可以列出每一页。我担心随着站点的扩展,这可能会成为性能问题。我不确定如何有效地解决这个问题,希望得到一些指导。下面是我调用来执行查询的方法。

   private List<dynamic> AdminSearchAll(string keyword)
        {
            string DDL = DDLAddDivision.SelectedValue;
            int DDLInt;
            int searchID = 0;
            if (int.TryParse(DDL, out DDLInt))
            {
                //int searchID;
                if (!int.TryParse(keyword, out searchID))
                    searchID = -1;  // set to an invalid ID
            }
            ItemContext db = new ItemContext();
            var contacts = (from c in db.Contacts
            join cat in db.Categories on c.CategoryID equals cat.CategoryID
            join div in db.Divisions on c.DivisionID equals div.DivisionID
                            where
                 (DDLInt == 1 || c.DivisionID == DDLInt) &&
                    (c.Deleted == false) &&
                                //Contains    
                    (
                     c.ContactName.Contains(keyword) ||
                     c.ContactEmail.Contains(keyword) ||
                     c.ContactOPhone.Contains(keyword) ||
                     c.ContactID.Equals(searchID)
                       )
                            select new
                            {
                                Name = c.ContactName,
                                Phone = c.ContactOPhone,
                                Type = c.Type,
                                Email = c.ContactEmail,
                                ID = c.ContactID
                            });
            var items = (from i in db.Item
            join cat in db.Categories on i.CategoryID equals cat.CategoryID
            join div in db.Divisions on i.DivisionID equals div.DivisionID
                         where
                           (DDLInt == 1 || i.DivisionID == DDLInt) &&
                           (i.Deleted == false) &&
                          //Contains
                     (
        i.ItemName.Contains(keyword) ||
        i.Email.Contains(keyword) ||
        i.Description.Contains(keyword) ||
        i.ItemID.Equals(searchID)
                      )
                         select new
                         {
                             Name = i.ItemName,
                             Phone = i.Phone,
                             Type = i.Type,
                             Email = i.Email,
                             ID = i.ItemID
                         });
            var all = contacts.Union(items);
            return all.ToList<dynamic>();

我使用Asp.net数据分页器进行分页。我每页显示10个结果。My Data Pager使用方法OnPreRender="Pager_PreRender"

protected void Pager_PreRender(object sender, EventArgs e)
        {
    if (IsPostBack)
                {

                        string keyword = txtSearch.Text.Trim();

                        List<dynamic> Cresults = AdminSearchAll(keyword);
    }
}

我的问题是什么是正确的方法使用LINQ SQL来限制我的查询只返回十个结果,而不是返回所有结果,只显示10,因为分页。PS我为所有的代码道歉,但我想让你看到我到底在做什么。

使用LINQ优化搜索结果

您可以在LINQ级别实现分页,而不是将其委托给数据分页器,但这需要重新编码。LINQ允许您执行skip - take操作,您可以指定适当的页面大小来跳过和取。

有很多方法可以实现这一点,但由于这是我看到的唯一部分代码,这里是我的建议。

  1. 将页面大小和当前页面参数传递给搜索方法
  2. 排序你的列表,以便适当的分页可以完成LINQ
  3. 订购后使用Skip()和Take()方法

点# 1

private List<dynamic> AdminSearchAll(string keyword, int pageSize, int currentPage)

搜索方法需要接受一个稍后将使用的pageSize和currentPage参数。

点# 2

var all = contacts.Union(items).OrderBy(a => a.Id);

您的列表需要排序,以便在后续调用该过程时,您仍然能够准确地定位要提取的集合。

第三点

var all = contacts.Union(items).OrderBy(a => a.Id).Skip(pageSize * currentPage)
                  .Take(pageSize);

Skip(int X)方法告诉LINQ,您想要跳过前X个数的条目。在本例中,我们跳过了pageSize * currentPage。如果您在第一页(索引0),则不会跳过任何项。Take (int X)方法告诉LINQ,您只想从起始索引中提取X个数的元素,这对应于您的页面大小。

当您返回"all.ToList()"时,它应该只包含pageSize参数中指定的元素数量。在主应用程序中,您应该能够轻松地跟踪每个会话的pageSize和currentPage。