如何使用反射值创建OrderBy语句



我想创建一个方法,通过给定的属性对IEnumerable List进行排序,其中该属性通过字符串传递到方法中,即(请注意,第一个代码示例不起作用,但第二个起作用,这也是我试图动态模拟的)。

string sortName = "SerialNumber";
IEnumerable<PartSummary> partList = FunctionToCreateList();
partOrderedList = partList.OrderBy(what do I stick in here);

这相当于

IEnumerable<PartSummary> partList = FunctionToCreateList();
partOrderedList = partList.OrderBy(p => p.SerialNumber);

我怎样才能做到这一点?

您是说要将订单传递给您的方法吗?如果是这样,你可以使用这个:

Expression<Func<PartSummary, bool>> orderByClause

然后你可以这样做:

partOrderedList = partList.OrderBy(orderByClause);

然后,您可以在业务层或任何您希望的地方处理您的订单。

好的,更新:如果你想把列名作为字符串传递,你可以做如下操作:

为扩展方法创建一个静态类(引用:http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/39028ad2-452e-409f-bc9e-d1b263e921f6/):

static class LinqExtensions
{
    public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string sortingColumn, bool isAscending)
    {
        if (String.IsNullOrEmpty(sortingColumn))
        {
            return source;
        }
        ParameterExpression parameter = Expression.Parameter(source.ElementType, String.Empty);
        MemberExpression property = Expression.Property(parameter, sortingColumn);
        LambdaExpression lambda = Expression.Lambda(property, parameter);
        string methodName = isAscending ? "OrderBy" : "OrderByDescending";
        Expression methodCallExpression = Expression.Call(typeof(Queryable), methodName,
                                            new Type[] { source.ElementType, property.Type },
                                            source.Expression, Expression.Quote(lambda));
        return source.Provider.CreateQuery<T>(methodCallExpression);
    }
}

然后你可以创建你的方法:

   static IQueryable<PartSummary> FunctionToCreateList()
    {
        IList<PartSummary> list = new List<PartSummary>();
        list.Add(new PartSummary
                     {
                         Id = 1,
                         SerialNumber = "A",
                     });
        list.Add(new PartSummary
                     {
                         Id = 2,
                         SerialNumber = "B",
                     });
        return list.AsQueryable();
    }

然后调用您的方法:

   static void Main(string[] args)
    {
        IQueryable<PartSummary> partOrderedList = FunctionToCreateList();
        PartSummary partSummary = new PartSummary();
        string sortBy = "Id";
        partOrderedList = partOrderedList.OrderBy(sortBy, false);
        foreach (PartSummary summary in partOrderedList)
        {
            Console.WriteLine(summary.Id + ", " + summary.SerialNumber);
        }
        Console.ReadLine();
    }

现在,您可以将列名作为字符串传入并排序。

希望这能有所帮助!

您也可以避免扩展,只需使用编译后的表达式树即可实现这一点:

    public Func<T, object> ResolveToProperty<T>(String propertyName)
    {
        Type t = typeof(T);
        var paramExpression = Expression.Parameter(t, "element");
        var propertyExpression = Expression.Property(paramExpression, propertyName);
        return Expression.Lambda<Func<T, object>>(propertyExpression, paramExpression).Compile();
    }
    string sortName = "SerialNumber";
    IEnumerable<PartSummary> partList = FunctionToCreateList();
    var partOrderedList = partList.OrderBy(ResolveToProperty<PartSummary>(sortName));

相关内容

  • 没有找到相关文章

最新更新