前段時間,公司讓我在財務端優化下顯示方式,原先的寫法在如今看來讓人有點想吐槽。之前的設計可能沒考虛欠缺,加載方式是一次性加載完,而後在根據當前頁分頁綁定顯示,而更要命的是這個頁面展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 }
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 }
定義參數以及方法調用,此處有個小細節,若是你是一對多的,必定要把多的那個字段在最後要查詢的結果體現,否則就分頁多少條就多少條,例如你要查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);
查詢結果展現,此部分略過,由於我把我怎麼展現的寫出來,到你那也可能不適應了。固然本文更多的是業務代碼,當你代碼駕馭能力提升了,建議不要這樣寫!