¿Cómo usar una cadena para crear un orden EF por expresión?

Estoy tratando de lograr esta conversión

"Address.Street" => (p) => p.Address.Street "Name" => (p) => p.Name 

Pude encontrar un método para generar un orden por expresión utilizando la reflexión, pero no funcionará para el tipo complejo como Address.Street ya que funciona para un solo nivel de propiedad.

¿Hay alguna forma de hacer esto? He visto que compilo expresiones lambda pero no pude entender cómo hacerlo funcionar para este caso.

Crear una expresión no es difícil, pero la parte difícil es cómo vincularla con los OrderBy(Descending) / ThenBy(Descendig) cuando no se conoce el tipo de propiedad (de ahí el tipo de resultado de la expresión del selector) .

Aquí está todo lo que encapsula en un método de extensión personalizado:

 public static partial class QueryableExtensions { public static IOrderedQueryable OrderByMember(this IQueryable source, string memberPath) { return source.OrderByMemberUsing(memberPath, "OrderBy"); } public static IOrderedQueryable OrderByMemberDescending(this IQueryable source, string memberPath) { return source.OrderByMemberUsing(memberPath, "OrderByDescending"); } public static IOrderedQueryable ThenByMember(this IOrderedQueryable source, string memberPath) { return source.OrderByMemberUsing(memberPath, "ThenBy"); } public static IOrderedQueryable ThenByMemberDescending(this IOrderedQueryable source, string memberPath) { return source.OrderByMemberUsing(memberPath, "ThenByDescending"); } private static IOrderedQueryable OrderByMemberUsing(this IQueryable source, string memberPath, string method) { var parameter = Expression.Parameter(typeof(T), "item"); var member = memberPath.Split('.') .Aggregate((Expression)parameter, Expression.PropertyOrField); var keySelector = Expression.Lambda(member, parameter); var methodCall = Expression.Call( typeof(Queryable), method, new[] { parameter.Type, member.Type }, source.Expression, Expression.Quote(keySelector)); return (IOrderedQueryable)source.Provider.CreateQuery(methodCall); }