c# – Dynamic Func,IOrderedQueryable> Expression

我正在使用这里提到的模式
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

我正在使用下面的方法查询EF

public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity,bool>> filter = null,Func<IQueryable<TEntity>,IOrderedQueryable<TEntity>> orderBy = null,string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' },StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

现在我想创建动态Func< IQueryable< TEntity>,IOrderedQueryable< TEntity>>表达式来订购我的数据.

我只知道字段名称为字符串和顺序类型(升序,降序)为字符串(asc,desc)

解决方法

最后我可以写出我想要的方法.
public static Func<IQueryable<TEntity>,IOrderedQueryable<TEntity>> GetorderBy(string orderColumn,string orderType) {
            Type typeQueryable = typeof(IQueryable<TEntity>);
            ParameterExpression argQueryable = Expression.Parameter(typeQueryable,"p");
            var outerExpression = Expression.Lambda(argQueryable,argQueryable);
            string[] props = orderColumn.Split('.');
            IQueryable<TEntity> query = new List<TEntity>().AsQueryable<TEntity>();
            Type type = typeof(TEntity);
            ParameterExpression arg = Expression.Parameter(type,"x");

            Expression expr = arg;
            foreach(string prop in props) {
                PropertyInfo pi = type.GetProperty(prop,BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                expr = Expression.Property(expr,pi);
                type = pi.PropertyType;
            }
            LambdaExpression lambda = Expression.Lambda(expr,arg);
            string methodName = orderType == "asc" ? "OrderBy" : "OrderByDescending";

            MethodCallExpression resultExp =
                Expression.Call(typeof(Queryable),methodName,new Type[] { typeof(TEntity),type },outerExpression.Body,Expression.Quote(lambda));
            var finalLambda = Expression.Lambda(resultExp,argQueryable);
            return (Func<IQueryable<TEntity>,IOrderedQueryable<TEntity>>)finalLambda.Compile();
        }

方法有两个参数,第一个是字段名,另一个是asc或desc.
方法的结果可以直接与IQueryable对象一起使用.

谢谢你的帮助

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...