Linq组建 Orderby动态表达式
/// <summary>
/// Linq组建 Orderby动态表达式 排序可传要排序的字段
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="source"></param>
/// <param name="propertyName"></param>
/// <param name="asc"></param>
/// <returns></returns>
public static IQueryable<TEntity> ExpandOrderBy<TEntity>(this IQueryable<TEntity> source, string propertyName,
bool asc = true) where TEntity : class
{
string command = asc ? "OrderBy" : "OrderByDescending";
var type = typeof(TEntity);
var property = type.GetProperty(propertyName);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExpression = Expression.Lambda(propertyAccess, parameter);
var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression));
return source.Provider.CreateQuery<TEntity>(resultExpression);
}
代码调用
namespace LinqRelatedOperations
{
class Program
{
static void Main(string[] args)
{
var res = new List<CorrespondingDataModel>()
{
new CorrespondingDataModel(){ A=1,B=2,C=3},
new CorrespondingDataModel(){ A=1,B=3,C=2},
new CorrespondingDataModel(){ A=2,B=1,C=3}
};
if (res != null && res.Any())
{
var obj = res.AsQueryable().ExpandOrderBy("B", true).ToList();
obj.ForEach(s => Console.WriteLine($"A:{s.A},B:{s.B},C:{s.C}"));
}
Console.ReadKey();
}
}
public class CorrespondingDataModel
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}
}
结果