easyui datagrid remoteSort的實現 Controllers編寫動態的Lambda表達式 IQueryable OrderBy擴展


  • EF 結合easy-ui datagrid 實現頁面端排序
  • EF動態編寫排序Lambda表達式

 

1、前端頁面

 var mainListHeight = $(window).height() - 20;
        $(document).ready(function () {
            $("#AppLogGrid").datagrid({
                "title": "應用程序日志記錄",
                "iconCls": "icon-blank",
                "width": "100%",
                "height": mainListHeight,
                "nowrap": false,
                "striped": true,
                "pagination": true,
                "rownumbers": true,
                "remoteSort": true,
                "pageList": [50, 100, 200, 500, 1000],
                "frozenColumns": [[
                 { "field": "ck", checkbox: true }
             ]],
                "toolbar": "#tb",
                "columns": [[
                { "field": "nId", "title": "序號", "width": 60, "align": "right", "sortable": true },
                { "field": "dtDate", "title": "日志記錄時間", "width": 120, "align": "center", "sortable": true },
                { "field": "sLevel", "title": "日志等級", "width": 80, "align": "center", "sortable": true },
                { "field": "sLogger", "title": "Logger類", "width": 80, "align": "left" },
                { "field": "sMessage", "title": "日志內容", "width": 660, "align": "left" }
            ]]
            })
            //初始化
            loadGrid();
        });
        //刷新表格
        function loadGrid() {
            var p = {
                "url": "/CommonBiz/GetAppLogList",
                "data": {
                    "Parameter": {
                        "LogLevel": $("#logLevel").val()
                    }
                }
            }
            $("#AppLogGrid").datagrid({ "url": p.url, "queryParams": { "Parameter": $.toJSON(p.data)} });
        }

設置了“dtDate”和“sLevel” 兩個字段允許( "remoteSort": true)在頁面排序。

2、后端Controller代碼

/// <summary>
        /// 獲取某類型日志記錄
        /// </summary>
        /// <returns></returns>
        public JsonResult GetAppLogList()
        {
            using (Reserve_DbEntities db = new Reserve_DbEntities())
            {
                var list = new List<AppSystemLog>();
                string queryParams = Request.Form["Parameter"];
                int pageRowNum = int.Parse(Request.Form["rows"]);
                int pageIndex = int.Parse(Request.Form["page"]);
                string sortField = Request.Form["sort"] as string;
                string order = Request.Form["order"] as string;
                if (!string.IsNullOrEmpty(queryParams))
                {
                    var resultJson = JObject.Parse(queryParams);
                    string level = resultJson["Parameter"]["LogLevel"].Value<string>();
                    if (string.IsNullOrEmpty(sortField))
                    {
                        if (level.Equals("ALL"))
                            list = db.AppSystemLog.OrderByDescending(l => l.nId).ToList();
                        else list = db.AppSystemLog.Where(l => l.sLevel == level).OrderByDescending(o => o.dtDate).ToList();
                    }
                    else
                    {
                        if (level.Equals("ALL"))
                            list = db.AppSystemLog.OrderBy<AppSystemLog>(sortField, order.Equals("asc") ? true : false).ToList();
                        else list = db.AppSystemLog.Where(l => l.sLevel == level).OrderBy<AppSystemLog>(sortField, order.Equals("asc") ? true : false).ToList();
                    }
                }
                var resultRows = list.Skip((pageIndex - 1) * pageRowNum).Take(pageRowNum).ToList();
                var jsonResult = new { total = list.Count, rows = resultRows };
                return Json(jsonResult, JsonRequestBehavior.AllowGet);
            }
        }

這里的技巧是需要擴展IQueryable,因為一般寫法是 list.OrderBy(o=>o.XXXX字段“顯示的寫法”)。而頁面post過來的字段名稱是會變的,這樣后端必須實現動態編寫Lambda表達式,一翻搜索發現擴展的方法:

/// <summary>
    /// IQueryable擴展
    /// </summary>
    public static class QueryableExter
    {
        public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName, bool ascending) where T : class
        {
            Type type = typeof(T);
            PropertyInfo property = type.GetProperty(propertyName);
            if (property == null)
                throw new ArgumentException("propertyName", "Not Exist");
            ParameterExpression param = Expression.Parameter(type, "p");
            Expression propertyAccessExpression = Expression.MakeMemberAccess(param, property);
            LambdaExpression orderByExpression = Expression.Lambda(propertyAccessExpression, param);
            string methodName = ascending ? "OrderBy" : "OrderByDescending";
            MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression));

            return source.Provider.CreateQuery<T>(resultExp);
        }
    }

3、截圖show

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM