具有动态排序依据的 LINQ 查询

2024-04-14

我有一个查询,我需要基于查询字符串参数进行排序。例如,如果排序参数是价格,则查询需要随价格更改。如果其评级则更改查询以按评级排序。

我知道 PredicateBuilder 可以执行 And 和 OR 操作,但是如何进行动态 ordeby linq 查询。


如果您确切地知道可用于订购的所有可能参数,那么乔恩的答案是最好的答案。但如果参数数量未知,您可以动态构建表达式。例如:

class Program
{
    static void Main(string[] args)
    {
        var people = new[]{
            new Person { Name = "David", Age = 40 },
            new Person { Name = "Maria", Age = 12 },
            new Person { Name = "Lucas", Age = 45 }
        }.AsQueryable();

        foreach (var p in people.OrderBy("Age"))
        {
            Console.Write(p.Name);
        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

static class IQueryableExtensions
{
    public static IQueryable<T> OrderBy<T>(this IQueryable<T> items, string propertyName)
    {
        var typeOfT = typeof(T);
        var parameter = Expression.Parameter(typeOfT, "parameter");
        var propertyType = typeOfT.GetProperty(propertyName).PropertyType;
        var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
        var orderExpression = Expression.Lambda(propertyAccess, parameter);

        var expression = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { typeOfT, propertyType }, items.Expression, Expression.Quote(orderExpression));
        return items.Provider.CreateQuery<T>(expression);
    }        
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有动态排序依据的 LINQ 查询 的相关文章