我有一个查询,我需要基于查询字符串参数进行排序。例如,如果排序参数是价格,则查询需要随价格更改。如果其评级则更改查询以按评级排序。
我知道 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(使用前将#替换为@)