¿Cómo aplico OrderBy en un IQueryable usando un nombre de columna de cadena dentro de un método de extensión genérico?

public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
  where T : EntityObject
{
  var param = Expression.Parameter(typeof(T), "o");
  var body = Expression.PropertyOrField(param,columnName);

  var sortExpression = Expression.Lambda(body, param);
  return query.OrderBy(sortExpression);
}

Debido a que el tipo de OrderBy no se infiere de sortExpression, necesito especificar algo como esto en tiempo de ejecución:

var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);

O

return query.OrderBy<T, TSortColumn>(sortExpression);

Sin embargo, no creo que esto sea posible, ya que TSortColumn solo se puede determinar durante el tiempo de ejecución.

¿Hay alguna forma de evitar esto?

Respuestas a la pregunta(8)

Su respuesta a la pregunta