我有一个使用分页的搜索。我的查询带来了更多的结果,然后我可以列出每页。我担心随着我的网站规模扩大,这可能会成为一个性能问题。我不确定如何有效地解决这个问题,并希望得到一些指导。下面是我调用以执行查询的方法。
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个结果。我的数据寻呼机使用方法OnPreRender="Pager_PreRender"
protected void Pager_PreRender(object sender, EventArgs e)
{
if (IsPostBack)
{
string keyword = txtSearch.Text.Trim();
List<dynamic> Cresults = AdminSearchAll(keyword);
}
}
我的问题是使用LINQ to SQL将我的查询限制为RETURN只有十个结果的正确方法是什么,而不是返回所有结果而只是因为寻呼机而显示10。 PS我为所有代码道歉,但我希望你能看到我在做什么。
答案 0 :(得分:2)
您可以在LINQ级别实现分页,而不是将其委托给数据分页器,但需要进行一些重新编码。 LINQ允许您执行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);
您的列表需要订购,以便在成功调用程序时,您仍然可以准确找到要提取的集合。
第3点
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。