Как я могу преобразовать это выражение linq?

Скажем, у меня есть объект, к которому я хочу обратиться с примененным ранжированием:

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

В моем запросе у меня есть следующее:

Expression 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();

Я попытался упорядочить результаты, прежде чем выбрать анонимный объект сRank собственности, но заказ в конечном итоге теряется. Похоже, что linq to entity отбрасывает упорядочение отдельных множеств и преобразует их обратно в естественное упорядочение во время обоихConcat а также .Union

Я думаю, что я могу сделать это динамическое преобразование выражения, определенного вorderBy переменная изx => x.Name вx => x.Entity.Name, но я'Я не уверен, как:

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

Как я могу быть в состоянии использоватьExpression.Lambda обернутьx => x.Name вx => x.Entity.Name? Когда я жесткий кодx => x.Entity.Name вThenBy Я получаю заказ, который хочу, ноorderBy обеспечивается вызывающим классом запроса, поэтому я неЯ не хочу, чтобы это было жестко закодировано. У меня это жестко закодировано в приведенном выше примере только для простоты объяснения.

Ответы на вопрос(2)

Ваш ответ на вопрос