Wie kann ich diesen Linq-Ausdruck transformieren?
Angenommen, ich habe eine Entität, die ich mit angewendetem Ranking abfragen möchte:
public class Person: Entity
{
public int Id { get; protected set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
In meiner Anfrage habe ich folgendes:
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();
Ich habe versucht, die Ergebnisse zu ordnen, bevor ich das anonyme Objekt mit der wähleRank
Eigentum, aber die Bestellung endet verloren. Es scheint, dass linq to entity die Reihenfolge der einzelnen Mengen verwirft und in beiden Fällen in die natürliche Reihenfolge zurückkehrtConcat
undUnion
.
Ich denke, ich kann den in der definierten Ausdruck dynamisch transformierenorderBy
variabel vonx => x.Name
zux => x.Entity.Name
aber ich bin nicht sicher wie:
if (orderBy != null)
{
var transformedExpression = ???
rankedResults = rankedResults.ThenBy(transformedExpression);
}
Wie könnte ich verwenden könnenExpression.Lambda
einpackenx => x.Name
inx => x.Entity.Name
? Wenn ich hart codierex => x.Entity.Name
in dieThenBy
Ich bekomme die Bestellung, die ich will, aber dieorderBy
wird von der aufrufenden Klasse der Abfrage bereitgestellt, sodass ich sie nicht fest codieren möchte. Ich habe sie im obigen Beispiel nur zur Vereinfachung der Erläuterung fest codiert.