【问题标题】:get property of inner object获取内部对象的属性
【发布时间】:2015-12-22 12:39:35
【问题描述】:

您好,我正在尝试使用该代码来获取包含用户的客户的属性 User.Email。但它是一个对象(用户类型的用户),所以它抛出异常。我应该解决什么问题?

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending)
    {
        if (!string.IsNullOrWhiteSpace(SortField))
        {
            var param = Expression.Parameter(typeof (T), "p");
            var prop = Expression.Property(param, SortField);
            var exp = Expression.Lambda(prop, param);
            string method = Ascending ? "OrderBy" : "OrderByDescending";
            Type[] types = new Type[] {q.ElementType, exp.Body.Type};
            var mce = Expression.Call(typeof (Queryable), method, types, q.Expression, exp);
            return q.Provider.CreateQuery<T>(mce);
        }
        else
        {
            return q;
        }
    }

【问题讨论】:

    标签: c# tree expression


    【解决方案1】:

    您需要将属性路径传递给函数(如“User.Email”)并在内部说明该路径,如下所示

    public static IQueryable<T> OrderByField<T>(this IQueryable<T> source, string sortField, bool ascending)
    {
        if (string.IsNullOrWhiteSpace(sortField)) return source;
        var item = Expression.Parameter(typeof(T), "item");
        Expression member = null;
        foreach (var memberName in sortField.Split('.'))
            member = Expression.PropertyOrField(member ?? item, memberName);
        var selector = Expression.Lambda(member, item);
        var method = ascending ? "OrderBy" : "OrderByDescending";
        var types = new [] { source.ElementType, selector.Body.Type };
        var expression = Expression.Call(typeof(Queryable), method, types, source.Expression, selector);
        return source.Provider.CreateQuery<T>(expression);
    }
    

    关键部分是

        var item = Expression.Parameter(typeof(T), "item");
        Expression member = null;
        foreach (var memberName in sortField.Split('.'))
            member = Expression.PropertyOrField(member ?? item, memberName);
    

    从表达式参数开始,为路径中指定的每个成员构建一个访问器。

    【讨论】:

      猜你喜欢
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      相关资源
      最近更新 更多