正用CSLA.NET做一個Web的項目, 發現CSLA的模型在開發Web時, 不是很適合中國國情.
他的一系列模版, 都是基於主從表單的考慮, 比如"采購單", 這樣有單頭, 有明細行的情況, 這在WinForm下很棒.
但Web下, 大部分對象都單獨用一個表單進行編輯, 所以感覺有些別扭.
我的理解還不深入, 還不斷學習中, 整個框架讓我受益很多. 廢話完了, 進入正題.
要在CSLA模型中方便的使用Sql2005的分頁, 我們要做四步.
第一步: 實現一個PagingCriteria, 用來傳遞分頁參數.
[Serializable()] public class PagingCriteria<T> : CriteriaBase { #region Filed public IDictionary ParamDic { get; private set; } public string SortExpression { get; private set; } public string DefaultOrder { get; private set; } public int StartRowIndex { get; private set; } public int MaximumRows { get; private set; } #endregion protected PagingCriteria(){ } public PagingCriteria(IDictionary paramDic, int startRowIndex, int maximumRows, string sortExpression, string defaultOrder) : base(typeof(T)) { ParamDic = paramDic; SortExpression = sortExpression; DefaultOrder = defaultOrder; StartRowIndex = startRowIndex; MaximumRows = maximumRows; } }
第二步: 實現PagingWrapper, 將普通的Sql語句封裝成可分頁的語句.
public static class PagingWrapper { private const string SQLTEMPLATE = @"With TargetTable AS(select ROW_NUMBER() OVER (order by Temp.{1})as RowNumber,Temp.* from ({0}) as Temp) select * from TargetTable WHERE RowNumber between {2} and {3};Select count(*) from ({0}) Temp"; public static string Wrap(string sqlQuery, string SortExpression, int startRowIndex, int maximumRows) { if (string.IsNullOrEmpty(SortExpression)) throw new Exception("未指定排序列."); return string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + maximumRows); } public static string Wrap<T>(string sqlQuery, PagingCriteria<T> criteria) { string order = (string.IsNullOrEmpty(criteria.SortExpression)) ? criteria.DefaultOrder : criteria.SortExpression; return Wrap(sqlQuery, order, criteria.StartRowIndex, criteria.MaximumRows); } }
第三部: 在集合對象中調用.這裡是RoleList.
using (SqlCommand cm = cn.CreateCommand()) { cm.CommandType = CommandType.Text; string sql =