zoukankan      html  css  js  c++  java
  • EntityFramework 动态构造排序 Func<IQueryable<T>, IOrderedQueryable<T>> Dynamic

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;
    using System.Text;
    /**
     * 
     * jackchain 
     * QQ:710782046
     * 2017-08-31
     * 动态构造OrderBy Linq序列
     * 
     */
    
    namespace UFX.Tools
    {
        public class ConvertExtOrderLinq
        {
            /// <summary>
            /// 动态转换为Linq排序
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="orderList">[aaa,bbb,ccc],[asc,asc,desc]</param>
            /// <returns></returns>
            public static Func<IQueryable<T>, IOrderedQueryable<T>> GetOrderBy<T>(List<string> orderColumn, List<string> orderDir)
            {
                string ascKey = "OrderBy";
                string descKey = "OrderByDescending";
    
                Type typeQueryable = typeof(IQueryable<T>);
                ParameterExpression argQueryable = Expression.Parameter(typeQueryable, "jk");
                var outerExpression = Expression.Lambda(argQueryable, argQueryable);
    
                for (int i = 0; i < orderColumn.Count; i++)
                {
                    string columnName = orderColumn[i];
                    string dirKey = orderDir[i].ToLower();
    
                    IQueryable<T> query = new List<T>().AsQueryable<T>();
                    Type type = typeof(T);
                    ParameterExpression arg = Expression.Parameter(type, "uf");
                    Expression expr = arg;
    
                    if (columnName.Contains("."))
                    {
                        // support to be sorted on child fields. 
                        String[] childProperties = columnName.Split('.');
                        System.Reflection.PropertyInfo property = typeof(T).GetProperty(childProperties[0]);
                        MemberExpression propertyAccess = Expression.MakeMemberAccess(arg, property);
    
                        for (int j = 1; j < childProperties.Length; j++)
                        {
                            Type t = property.PropertyType;
                            if (!t.IsGenericType)
                            {
                                property = t.GetProperty(childProperties[j]);
                            }
                            else
                            {
                                property = t.GetGenericArguments().First().GetProperty(childProperties[i]);
                            }
                            type = property.PropertyType;
                            expr = Expression.MakeMemberAccess(propertyAccess, property);
                            //propertyAccess = Expression.MakeMemberAccess(propertyAccess, property);
                        }
                        //property = type.GetProperty(propertyName);
                        //propertyAccess = Expression.MakeMemberAccess(parameter, property);
                    }
                    else
                    {
                        PropertyInfo pi = type.GetProperty(columnName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                        expr = Expression.Property(expr, pi);
                        type = pi.PropertyType;
                    }
    
                    LambdaExpression lambda = Expression.Lambda(expr, arg);
                    string methodName = dirKey == "asc" ? ascKey : descKey;
                    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(T), type }, outerExpression.Body, Expression.Quote(lambda));
    
                    outerExpression = Expression.Lambda(resultExp, argQueryable);
    
                    ascKey = "ThenBy";
                    descKey = "ThenByDescending";
                }
                return (Func<IQueryable<T>, IOrderedQueryable<T>>)outerExpression.Compile();
            }
    
        }
    }

     如何使用?

    [Action]
            [Description("获取Grid数据")]
            [HttpPost]
            public JsonResult Get(int start, int length, ExtGridSearch condition, ExtGridMutiSearch[] extCdns, ExtGridOrder[] order)
            {
                int totalCount = 0;
    
                Func<IQueryable<DB_Color>, IOrderedQueryable<DB_Color>> dyncOrder = ConvertExtOrderLinq.GetOrderBy<DB_Color>(order.Select(s => s.column).ToList(), order.Select(s => s.dir).ToList());
                var list = WMFactory.DBColor.FindByPage(start, length, out totalCount,
                                                          dyncOrder,
                                                          null, condition, extCdns);
                return Json(new { data = list, recordsTotal = totalCount, recordsFiltered = totalCount }, JsonRequestBehavior.AllowGet);
            }

    可结合Datatables 插件一起配合使用

     //主表格
            var DBRangeGrid = $('#DBRangeGrid').dataTable(
                {
                    scrollY: Global_MainTableHeight,
                    scrollX: true,
                    autoWidth: true,
                    scrollCollapse: false,
                    "processing": true,
                    "serverSide": true,
                    "ajax": {
                        "url": "/Admin/Range/Get",
                        "type": "POST",
                        "data": function (d) {
                            var dtCols = $('#DBRangeGrid').DataTable().settings().init().columns;
                            var extOrder = [];
                            var dtOrders = $('#DBRangeGrid').DataTable().order();
                            $.each(dtOrders, function (i, item) {
                                extOrder.push({ column: dtCols[item[0]].data, dir: item[1] });
                            })
                            d.order = extOrder;
                            d.query = $("#txtSearchKey").val();
                            d.fields = ['IsEnable', 'Year.YearName', 'Season.SeasonName', 'RangeName', 'Remark', 'CreateUser', ];
                        }
                    },
                    "ordering": true,
                    "order": [[8, "desc"]],
                    "columns": [
                        {
                            "class": "cbcenter",
                            "orderable": false,
                            "title": '<input type="checkbox" title="全选" class="selectAll" />',
                            "data": "Id",
                            "width": "30px",
                            "render": function (data, type, row) {
                                return '<input type="checkbox" class="ckbox" />';
                            }
                        },
                        {
                            "title": "启用", "data": "IsEnable", render: function (data, tp, row) {
                                 
                                if (row.IsEnable == 1) {
                                    return "<span style='color:green'>启用</span>";
                                } else {
                                    return "<span style='color:red'>禁用</span>";
                                }
                            }
                        },
                        { "title": "年份", "data": "Year.YearName" },
                        { "title": "季节", "data": "Season.SeasonName" },
                        { "title": "月份", "data": "Month" },
                        { "title": "波段名称", "data": "RangeName" },
                        { "title": "备注", "data": "Remark" },
                        {
                            "data": "CreateUser", "title": "操作人", "width": "40px", "render": function (data, type, record) {
                                if (record.ModifyUser != undefined && record.ModifyUser != "" && record.ModifyUser != null) return record.ModifyUser;
                                else return data;
                            }
                        },
                        {
                            "data": "CreateTime", "title": "操作时间", "width": "120px", "render": function (data, type, record) {
                                if (record.ModifyTime != undefined && record.ModifyTime != "" && record.ModifyTime != null) data = record.ModifyTime;
                                var dt = eval("new " + data.substr(1, data.length - 2));
                                return dt.Format("yyyy-MM-dd hh:mm:ss");
                            }
                        }
                    ]
                });
  • 相关阅读:
    linux中ll和du的区别
    django+celery+redis环境搭建
    python中若干错误
    js正则表达式中匹配反引号
    yii学习小结
    linux下DNS设置以及解析顺序
    apache中若干模块的安装
    HTML基础
    selenium
    selenium
  • 原文地址:https://www.cnblogs.com/qidian10/p/7459114.html
Copyright © 2011-2022 走看看