This article describes the dynamic OrderBy usage of C# linq query. Share it for your reference. The specific analysis is as follows:
groupList is the original data collection, List<T>
sortOrder is sort type, desc or asc
sortName is the sort attribute name
1. Use reflection.
private static object GetPropertyValue(object obj, string property) { propertyInfo = ().GetProperty(property); return (obj, null); } var resultList = sortOrder == "desc" ? (p => GetPropertyValue(p, sortName)) : (p => GetPropertyValue(p, sortName)); //linq method:// var resultList1 = from p in groupList orderby GetPropertyValue(p, ) select p; if (sortOrder == "desc") resultList1 = from p in groupList orderby GetPropertyValue(p, sortName) descending select p;
2. Call AsQueryable()
Convert generic <T> to generic <T>.
var groupQueryList = ();//here var tmpList = (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 = ('.'); Type type = typeof(T); ParameterExpression arg = (type, "x"); Expression expr = arg; foreach(string prop in props) { // use reflection (not ComponentModel) to mirror LINQ PropertyInfo pi = (prop); expr = (expr, pi); type = ; } Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type); LambdaExpression lambda = (delegateType, expr, arg); object result = typeof(Queryable).GetMethods().Single( method => == methodName && && ().Length == 2 && ().Length == 2) .MakeGenericMethod(typeof(T), type) .Invoke(null, new object[] {source, lambda}); return (IOrderedQueryable<T>)result; }
I hope this article will be helpful to everyone's C# programming.