C # query dynamic OrderBy by using linq,
GroupList is a collection of raw data, List <T>
SortOrder is the sorting type, desc or asc
SortName is the name of the sorting attribute.
1. Use reflection.
Private static object GetPropertyValue (object obj, string property) {System. reflection. propertyInfo propertyInfo = obj. getType (). getProperty (property); return propertyInfo. getValue (obj, null);} var resultList = sortOrder = "desc "? GroupList. orderByDescending (p => GetPropertyValue (p, sortName): groupList. orderBy (p => GetPropertyValue (p, sortName); // use the following method: // var resultList1 = from p in groupList orderby GetPropertyValue (p, m. sortName) select p; if (sortOrder = "desc") resultList1 = from p in groupList orderby GetPropertyValue (p, sortName) descending select p;
2. Call AsQueryable ()
Convert Generic System. Collections. Generic. IEnumerable <T> to Generic System. Linq. IQueryable <T>.
var groupQueryList = groupList.AsQueryable();//herevar tmpList = groupQueryList.OrderBy(sortName, sortOrder);
The following extension method is required:
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderByDescending"); } public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "ThenBy"); } public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "ThenByDescending"); } static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName) { string[] props = property.Split('.'); Type type = typeof(T); ParameterExpression arg = Expression.Parameter(type, "x"); Expression expr = arg; foreach(string prop in props) { // use reflection (not ComponentModel) to mirror LINQ PropertyInfo pi = type.GetProperty(prop); expr = Expression.Property(expr, pi); type = pi.PropertyType; } Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type); LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg); object result = typeof(Queryable).GetMethods().Single( method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetGenericArguments().Length == 2 && method.GetParameters().Length == 2) .MakeGenericMethod(typeof(T), type) .Invoke(null, new object[] {source, lambda}); return (IOrderedQueryable<T>)result; }
Reference: http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet#41262