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.