SoFunction
Updated on 2025-03-06

C# linq query dynamic OrderBy usage example

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 =&gt; GetPropertyValue(p, sortName)) : (p =&gt; 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.