动态Func键<&IQueryable的LT; TEntity>中IOrderedQueryable< TEntity>>表达 [英] Dynamic Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> Expression

查看:645
本文介绍了动态Func键<&IQueryable的LT; TEntity>中IOrderedQueryable< TEntity>>表达的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


http://www.asp.net/mvc/tutorials/getting-started-with-ef-使用-MVC /实施的非存储库和-单位按工作模式,在一个-ASP净MVC应用程序

而且我在使用以下方法来查询EF

And i am using method below to query 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();
        }
    }

现在我想创建动态函数功能:LT; IQueryable的< TEntity>中IOrderedQueryable< TEntity>> 表达订购我的数据。

Now i want to create dynamic Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> expression to order my data.

我只知道字段名的字符串和订单类型(上升,下降)作为字符串(ASC,DESC)

I know only field name as string and order type (ascending, descending) as string (asc, desc)

推荐答案

终于我可以写我想要的方式

finally i could write the method i want.

 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();
        }

这方法有两个参数,第一个字段名称另一个是递增或递减。方法
结果可以直接与IQueryable的对象使用。

This method takes two parameters, first one field name other one is asc or desc. Result of method can be used directly with IQueryable object.

感谢您的帮助。

这篇关于动态Func键&LT;&IQueryable的LT; TEntity&gt;中IOrderedQueryable&LT; TEntity&GT;&GT;表达的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆