Jak mogę przekształcić to wyrażenie linq?
Powiedzmy, że mam encję, której chcę użyć w rankingu:
public class Person: Entity
{
public int Id { get; protected set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
W moim zapytaniu mam następujące:
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();
Próbowałem zamówić wyniki przed wybraniem anonimowego obiektu za pomocąRank
nieruchomości, ale zamawianie kończy się zgubieniem. Wydaje się, że linq do jednostek odrzuca porządkowanie oddzielnych zestawów i konwertuje z powrotem do naturalnego porządku podczas obuConcat
iUnion
.
Myślę, że mogę to zrobić dynamicznie przekształcić wyrażenie zdefiniowane worderBy
zmienna odx => x.Name
dox => x.Entity.Name
, ale nie jestem pewien, jak:
if (orderBy != null)
{
var transformedExpression = ???
rankedResults = rankedResults.ThenBy(transformedExpression);
}
Jak mógłbym użyćExpression.Lambda
zawijaćx => x.Name
wx => x.Entity.Name
? Kiedy utrudniam kodx => x.Entity.Name
wThenBy
Dostaję zamówienie, które chcę, aleorderBy
jest dostarczany przez klasę wywołującą kwerendę, więc nie chcę go wpisywać na stałe. W powyższym przykładzie został on zakodowany na sztywno tylko dla uproszczenia wyjaśnień.