委託+拉姆達=自動排序(一),委託拉姆達排序
我們總能看到和使用到根據欄位排序的功能,也就是檔案總管中的點擊自動排序的效果:
要實現這個功能首先必須在介面的html代碼中進行如下設定:
即:為要排序的欄位設定:sortable屬性,也就是將該欄位設定為可排序。
既然是介面的排序,就必須存在一個參數,向後台調取相應的方法返回資料到介面,那麼方法有二:
1.將要排序的欄位作為參數,層層傳遞,到後台調取方法:
<span style="font-size:18px;"> //擷取sort時,如果sort為空白,則預設排序欄位為“entityName”,否則為擷取到的欄位。 string sort = Request["sort"] == null ? "EntityName" : Convert.ToString(Request["sort"].ToString()); //order同理:預設的排序方式為升序 string order = Request["order"] == null ? "asc" : Convert.ToString(Request["order"]);</span>
將兩個參數層層傳遞,最後使用底層的LoadpageItems方法:
//pageSize:每頁顯示的資料條數; pageIndex:頁碼
//total:總數量
// wherelamdba:查詢條件(拉姆達運算式的形式)
//orderbyLambda:排序條件
//isAsc :是否為升序
<span style="font-size:18px;"> IQueryable<T> LoadPageItems<Tkey>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Func<T, Tkey> orderbyLambda, bool isAsc);</span>
其中的whereLamda:說簡單了就是一個帶有order by 的sql語句;所有需要的參數和條件都具備之後,就可以有目的的查詢到資料庫中的資料,最後將資料一層層的返回到介面層,呈現給使用者。
2.在查詢到所有資料之後,未顯示到介面之前,也就是在controller中直接對資料進行排序:
<span style="font-size:18px;"> /// <summary> /// 查詢資料-->排序 /// </summary> /// <param name="entityName">實體名稱</param> /// <returns></returns> public JsonResult QueryData(string strCondition) { //頁面的條數 int pageSize = Int32.Parse(Request.Params["rows"].ToString()); //要載入的頁數,第幾頁 int pageIndex = Int32.Parse(Request.Params["page"].ToString()); int total = 0; #region 根據查詢條件,進行查詢 try { List<NonQueryPropertiesViewModel> ltProp = nonQueryPropertiesServiceWCF.GetAllNonQueryProperties(pageSize, pageIndex, out total, strCondition); //執行個體化另外一個對象,承載對ltProp.orderBy 的集合, //然後再對ltAgain中的資料進行表頭拼接 //擷取sort時,如果sort為空白,則預設排序欄位為“entityName”,否則為擷取到的欄位。 string sort = Request["sort"] == null ? "EntityName" : Convert.ToString(Request["sort"].ToString()); //string order = Request["order"] == null ? "asc" : Convert.ToString(Request["order"]); List<NonQueryPropertiesViewModel> ltAgain = ltProp.OrderBy(u => u.GetType().GetProperty(sort).GetValue(u, null)).ToList(); // 集合重新整合,拼接表格標題 var ltPropView = ltAgain.Select( p => new { p.NonQueryId, p.EntityName, p.EntityDesc, p.PropertyName, p.PropertyDesc, p.Controls.ControlId, p.Controls.ControlDesc, p.ControlHtmlId, p.PropertyOrder, p.ControlHtmlName, p.IsShow, p.IsNecessary } ).ToList(); // 轉換成JSON,傳遞給easyui-datagrid //拼接JSon格式 //定義傳回值 var strjson = new { total, rows = ltPropView }; return Json(strjson, JsonRequestBehavior.AllowGet); } catch (Exception e) { throw e; } #endregion } #endregion</span> 使用這種方法,我們直接借用泛型集合的order By 屬性,根據排序條件和排序的方式對資料進行排序,然後將排好的資料也就是LtAgain 中的資料賦給介面,這樣介面第一次載入時,顯示的就是以EntityName為預設排序欄位的資料。當點擊其他欄位,資料會實現相應的操作。
雖然我們有兩種選擇,但編程上向來講究效率,也就是程式反應的敏銳度。那麼我們來分析上面兩種方法:
第一種方法最容易想到,但在合作開發中必須底層有LoadpageItems的方法,另外,每次單擊不同的欄位進行排序,整個擷取資料的過程都要重新執行,不僅僅浪費了空間,也降低了程式的執行效率。
第二種方法在查詢資料的基礎上進行排序,查詢資料的方法得以再次利用,既減少了底層方法的重新開發,也使得每次排序只要在controller中重新排序即可,這樣一來既提高了效率也節省了時間。
綜上所述,開發中不僅僅是對已有知識的運用,更重要的是巧妙地使用已有資源,提高效率。