¿Cómo puedo transformar esta expresión linq?
Digamos que tengo una entidad que quiero consultar con clasificación aplicada:
public class Person: Entity
{
public int Id { get; protected set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
En mi consulta tengo lo siguiente:
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();
He intentado ordenar los resultados antes de seleccionar el objeto anónimo con elRank
Propiedad, pero el pedido termina perdiéndose. Parece que linq a las entidades descarta el orden de los conjuntos separados y vuelve al orden natural durante ambosConcat
yUnion
.
Lo que creo que puedo hacer es transformar dinámicamente la expresión definida en elorderBy
variable desdex => x.Name
ax => x.Entity.Name
, pero no estoy seguro de cómo
if (orderBy != null)
{
var transformedExpression = ???
rankedResults = rankedResults.ThenBy(transformedExpression);
}
¿Cómo podría ser capaz de usarExpression.Lambda
envolverx => x.Name
dentrox => x.Entity.Name
? Cuando codigo durox => x.Entity.Name
en elThenBy
Tengo el pedido que quiero, pero elorderBy
es proporcionado por la clase que llama de la consulta, por lo que no quiero incluirlo en el código. Lo tengo en el ejemplo anterior para simplificar la explicación solamente.