如果9年工作经验确实不该问这样的问题,自己即使不会,百度肯定能找到的。
给你个吧
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Artisan.Framework.Extension { public static class QueryableExtension { public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string propertyName, string order = "asc") { return _OrderBy<T>(query, propertyName, !(order.ToLower() == "asc")); } public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string propertyName, bool isAsc = true) { return _OrderBy<T>(query, propertyName, !isAsc); } public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string propertyName) { return _OrderBy<T>(query, propertyName, false); } public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string propertyName) { return _OrderBy<T>(query, propertyName, true); } static IOrderedQueryable<T> _OrderBy<T>(IQueryable<T> query, string propertyName, bool isDesc) { string methodname = (isDesc) ? "OrderByDescendingInternal" : "OrderByInternal"; BindingFlags flag = BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance; var memberProp = typeof(T).GetProperty(propertyName, flag); var method = typeof(QueryableExtension).GetMethod(methodname).MakeGenericMethod(typeof(T), memberProp.PropertyType); return (IOrderedQueryable<T>)method.Invoke(null, new object[] { query, memberProp }); } public static IOrderedQueryable<T> OrderByInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty) { return query.OrderBy(_GetLamba<T, TProp>(memberProperty)); } public static IOrderedQueryable<T> OrderByDescendingInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty) { return query.OrderByDescending(_GetLamba<T, TProp>(memberProperty)); } static Expression<Func<T, TProp>> _GetLamba<T, TProp>(PropertyInfo memberProperty) { if (memberProperty.PropertyType != typeof(TProp)) throw new Exception(); var thisArg = Expression.Parameter(typeof(T)); var lamba = Expression.Lambda<Func<T, TProp>>(Expression.Property(thisArg, memberProperty), thisArg); return lamba; } } }
看了一下,你做软件9年了居然,要不还以为这是毕业生问的问题。
你搜索 Linq Dynamic 就知道怎么做了。