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.Nameaber 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage