Dire que j'ai une entité que je veux interroger avec le classement appliqué:Comment puis-je transformer cette expression linq?
public class Person: Entity
{
public int Id { get; protected set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
Dans ma requête, je donne les résultats suivants:
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();
J'ai essayé de commander les résultats avant de sélectionner l'objet anonyme la propriété Rank
, mais la commande finit par se perdre. Il semble que linq aux entités rejette l'ordre des ensembles séparés et les convertit à l'ordre naturel pendant les deux et Union
.
Ce que je pense que je peux être en mesure de faire est de transformer dynamiquement l'expression définie dans la variable de x => x.Name
à x => x.Entity.Name
orderBy
, mais je ne suis pas sûr de savoir comment:
if (orderBy != null)
{
var transformedExpression = ???
rankedResults = rankedResults.ThenBy(transformedExpression);
}
Comment pourrais-je être en mesure d'utiliser Expression.Lambda
pour envelopper x => x.Name
dans x => x.Entity.Name
? Lorsque je code dur x => x.Entity.Name
dans le ThenBy
je reçois la commande que je veux, mais le orderBy
est fourni par la classe appelante de la requête, donc je ne veux pas le coder en dur. Je l'ai codé en dur dans l'exemple ci-dessus pour la simplicité de l'explication seulement.
J'ai supprimé ma réponse pour essayer de récupérer la prime. Si vous publiez un commentaire de suivi une fois que vous l'aurez remis à Aron, je le re-posterai au cas où cela aiderait quelqu'un dans le futur. BTW, avez-vous essayé ma solution, et si oui, cela a-t-il fonctionné? –
@MikeStrobel merci j'apprécie vraiment cela. Vous pouvez aller de l'avant et republier votre réponse en tant que séparé, juste ne pas supprimer celui que vous avez supprimé s'il vous plaît. J'attends toujours que la prime soit remboursée pour que je puisse la récompenser. – danludwig
L'utilisation d'une classe d'espace réservé fortement typée ici aurait sauvé beaucoup d'ennuis. –