1

ページネーションを使用した検索があります。私のクエリは、ページごとにリストできるよりも多くの結果を返します。私のサイトが拡大するにつれて、これがパフォーマンスの問題になる可能性があるのではないかと心配しています. この問題に効果的に対処する方法がわからないため、何らかのガイダンスを期待していました。以下は、クエリを実行するために呼び出すメソッドです。

   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 すべてのコードについてお詫び申し上げます。

4

1 に答える 1

2

ページネーションをデータ ページャーに委任するのではなく、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);

プロシージャーの呼び出しが連続して発生したときに、抽出するセットを正確に特定できるように、リストを順序付けする必要があります。

ポイント#3

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

Skip(int X) メソッドは、最初の X 個のエントリを渡すことを LINQ に通知します。この場合、pageSize * currentPage をスキップしました。最初のページ (インデックス 0) にいる場合、アイテムはスキップされません。Take (int X) メソッドは、ページ サイズに対応する開始インデックスから X 個の要素のみを抽出することを LINQ に通知します。

「all.ToList()」を返すときは、pageSize パラメータで指定された数の要素のみを含める必要があります。メイン アプリケーションでは、セッションごとに pageSize と currentPage を簡単に追跡できるはずです。

于 2013-01-11T05:35:04.853 に答える