ページネーションを使用した検索があります。私のクエリは、ページごとにリストできるよりも多くの結果を返します。私のサイトが拡大するにつれて、これがパフォーマンスの問題になる可能性があるのではないかと心配しています. この問題に効果的に対処する方法がわからないため、何らかのガイダンスを期待していました。以下は、クエリを実行するために呼び出すメソッドです。
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 Data Pager を使用しています。1 ページあたり 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 to SQL を使用して、ページャーのためにすべての結果を返し、10 のみを表示するのではなく、ページング時に 10 の結果のみを返すようにクエリを制限する正しいアプローチは何かということです。PS すべてのコードについてお詫び申し上げます。