Como posso transformar essa expressão linq?

Digamos que eu tenha uma entidade que desejo consultar com a classificação aplicada:

public class Person: Entity
{
    public int Id { get; protected set; }
    public string Name { get; set; }
    public DateTime Birthday { get; set; }
}

Na minha consulta, tenho o seguinte:

Expression<Func<Person, object>> orderBy = x => x.Name;

var dbContext = new MyDbContext();

var keyword = "term";
var startsWithResults = dbContext.People
    .Where(x => x.Name.StartsWith(keyword))
    .Select(x => new {
        Rank = 1,
        Entity = x,
    });
var containsResults = dbContext.People
    .Where(x => !startsWithResults.Select(y => y.Entity.Id).Contains(x.Id))
    .Where(x => x.Name.Contains(keyword))
    .Select(x => new {
        Rank = 2,
        Entity = x,
    });

var rankedResults = startsWithResults.Concat(containsResults)
    .OrderBy(x => x.Rank);

// TODO: apply thenby ordering here based on the orderBy expression above

dbContext.Dispose();

Tentei ordenar os resultados antes de selecionar o objeto anônimo com oRank propriedade, mas a encomenda acaba por se perder. Parece que as entidades linq para descarta a ordenação dos conjuntos separados e converte de volta para ordenamento natural durante ambosConcat eUnion.

O que eu acho que eu posso fazer é transformar dinamicamente a expressão definida noorderBy variável dex => x.Name parax => x.Entity.Name, mas não sei como:

if (orderBy != null)
{
    var transformedExpression = ???
    rankedResults = rankedResults.ThenBy(transformedExpression);
}

Como posso usarExpression.Lambda embrulharx => x.Name para dentrox => x.Entity.Name? Quando eu codificox => x.Entity.Name noThenBy Eu recebo o pedido que eu quero, mas oorderBy é fornecido pela classe chamadora da consulta, portanto, não quero codificá-lo. Eu o instalei no exemplo acima apenas para simplificar a explicação.

questionAnswers(2)

yourAnswerToTheQuestion