Come usare una stringa per creare un ordine EF per espressione?

Sto cercando di ottenere questa conversione

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

Sono stato in grado di trovare un metodo per generare un ordine per espressione utilizzando il reflection ma non funzionerà per un ordinamento complesso come Address.Street poiché funziona per un singolo livello di proprietà.

C’è un modo per fare questo? Ho visto che compilo espressioni lambda ma non riesco a capire come farlo funzionare per questo caso.

Creare un’espressione non è difficile, ma la parte difficile è come associarlo ai corrispondenti metodi OrderBy(Descending) / ThenBy(Descendig) quando non si conosce il tipo di proprietà (da cui il tipo del risultato dell’espressione selettore) .

Ecco tutto ciò che è incapsulato in un metodo di estensione personalizzato:

 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); }