分頁實現起來其實也很簡單

  前段時間,公司讓我在財務端優化下顯示方式,原先的寫法在如今看來讓人有點想吐槽。之前的設計可能沒考虛欠缺,加載方式是一次性加載完,而後在根據當前頁分頁綁定顯示,而更要命的是這個頁面展sql

示的又不是一個表的數據,還有一個關聯表,關係是一對多,又得把關聯後的字段一併顯示,當兩張表一樣數據過萬的時候,問題出現了,頁面須要好久才能加載出來,讓客戶認爲咱們這個頁面是否是有問題。不數據庫

得不說,當客戶懷疑你軟件的功能的時候,那麼就該從新思考代碼是否是真的有問題了。ide

  之前想優化這個功能,確實是傷神,曾經想到用存儲過程,固然用存儲過程也能實現,多是不太熟,總想一下搞定,後來決定棄用了,而本身也比較討厭邏輯實現須要屢次訪問數據庫(會讓代碼整理性能變性能

差),多是實現功能寫代碼並不想作的僅僅是這個地方實現的緣由,就公開了一個分頁的方法(此方法不是原創),傳入參數自動實現拼接就能實現獲取本身想要的功能。分頁總理思路,若有條件需先獲取模糊優化

查詢條件,而後獲取總頁的數據量,在查詢那裏查出總體數量,把分頁查詢以及頁面展現單獨抽出來,這樣在選擇上一頁,下一頁,以及跳頁時調用這個抽出來的方法,根據當前頁就能夠了,既提升了性能(沒必要spa

每次查總頁數),又提升了代碼的可讀性。分頁的實現步驟是設計

  1)定義兩個字段變量 當前頁(m_currentPage)和一個總共頁數m_totalPage,在查主表 記錄時初始化這兩個變量code

  2)若有模糊查詢,就重構一個獲取模糊條件的方法 GetFuzzyCondition(),固然我此處的代碼可能對你有點不適應,僅供參考orm

 1  /// <summary>
 2  /// 獲取模糊查詢條件
 3  /// </summary>
 4  /// <returns>空或者模糊查詢條件</returns>
 5 private string GetFuzzyCondition()
 6 {
 7        string strReturn = null;
 8        string strQueryText = tb_queryText.Text.Trim();
 9         if (string.IsNullOrEmpty(strQueryText))
10         {
11                 strReturn = "";
12         }
13         else
14         {
15                 strQueryText = "%" + strQueryText + "%";
16                 strReturn = "A.CardID LIKE '" + strQueryText + "'";
17                 strReturn = " And B.LicenseNumber LIKE '" + strQueryText + "'";
18         }
19          return strReturn;
20 }
View Code1

  3)公開一個 多表關聯分頁查詢 的方法,而後傳入參數參數最後查詢出結果返回DataTable,以及完成數據展示blog

 1 /// <summary>
 2 /// 多表關聯分頁查詢
 3 /// </summary>
 4 /// <param name="tableName">表名</param>
 5 /// <param name="QueryField">查詢字段</param>
 6 /// <param name="SubqueryField">子表字段</param>
 7 /// <param name="orderSql">以哪一個字段排序</param>
 8 /// <param name="whereSql">查詢條件</param>
 9 /// <param name="currentPage">當前頁</param>
10 /// <param name="pageSize">每頁顯示大小</param>
11 /// <param name="AssociateQuery">關聯表</param>
12 /// <returns>DataTable 數據集</returns>
13 public static DataTable QueryPageData(string tableName, string QueryField, string SubqueryField, string orderSql, string subWhereSql, int currentPage, int pageSize, string AssociateQuery = "", string whereSql = "")
14 {
15             
16             if (string.IsNullOrWhiteSpace(SubqueryField))
17             {
18                 SubqueryField = "*";
19             }
20             if (string.IsNullOrWhiteSpace(QueryField))
21             {
22                 QueryField = "*";
23             }
24             //優化,由於拼接的語句有條件,而若是傳入的沒有條件,可能查詢不到數據
25             if (string.IsNullOrWhiteSpace(subWhereSql))
26             {
27                 subWhereSql = " 1=1 ";
28             }
29             subWhereSql = subWhereSql.Replace("where", "");
30 
31             int intBeginIndex = (currentPage - 1) * pageSize;
32             int intEndIndex = currentPage * pageSize;
33 
34             string sql = "select {0} from(";
35             sql += " select ROW_NUMBER() over(ORDER BY {1}) as         
36 RowNumber,{2} from {3} where {4} ";
37             sql += " ) as A {5} where RowNumber>{6} and RowNumber<={7} ";
38             sql = string.Format(sql, QueryField, orderSql, SubqueryField, tableName, subWhereSql, AssociateQuery,intBeginIndex, intEndIndex);
39             sql += whereSql;
40 
41             return Common.CommonSQL.ExecSQL(sql);
42 }
View Code

     定義參數以及方法調用,此處有個小細節,若是你是一對多的,必定要把多的那個字段在最後要查詢的結果體現,否則就分頁多少條就多少條,例如你要查50條,沒加那個多表的字段,你最後的結果也就是50條。

1 string strTableName = "TVIPCard";
2 string strQueryCondition = GetFuzzyCondition();
3 string strQueryField = "A.CardID, A.CardType, A.CardTimes, A.IsValid, A.UserName, A.TelephoneNum, A.CompanyName, A.Remark,ISNULL(B.LicenseNumber,'') as LicenseNumber, A.AddTime";
4 string strSubQueryField = "CardID, CardType, CardTimes, IsValid, UserName, TelephoneNum, CompanyName, Remark, AddTime";
5 string strOrderBySql = "CardID";
6 string strAssociateQuery = " left join TVIPCardAndLicNum b on A.CardID = b.CardID ";
7 string strWhereSql = "";
8 
9 DataTable tableRes = Common.CommonSQL.QueryPageData(strTableName, strQueryField, strSubQueryField, strOrderBySql, "", m_currentPage, PageSize, strAssociateQuery, strWhereSql);
View Code

  查詢結果展現,此部分略過,由於我把我怎麼展現的寫出來,到你那也可能不適應了。固然本文更多的是業務代碼,當你代碼駕馭能力提升了,建議不要這樣寫!

相關文章
相關標籤/搜索