Как я могу преобразовать это выражение linq?
Скажем, у меня есть объект, к которому я хочу обратиться с примененным ранжированием:
public class Person: Entity
{
public int Id { get; protected set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
В моем запросе у меня есть следующее:
Expression 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();
Я попытался упорядочить результаты, прежде чем выбрать анонимный объект сRank
собственности, но заказ в конечном итоге теряется. Похоже, что linq to entity отбрасывает упорядочение отдельных множеств и преобразует их обратно в естественное упорядочение во время обоихConcat
а также .Union
Я думаю, что я могу сделать это динамическое преобразование выражения, определенного вorderBy
переменная изx => x.Name
вx => x.Entity.Name
, но я'Я не уверен, как:
if (orderBy != null)
{
var transformedExpression = ???
rankedResults = rankedResults.ThenBy(transformedExpression);
}
Как я могу быть в состоянии использоватьExpression.Lambda
обернутьx => x.Name
вx => x.Entity.Name
? Когда я жесткий кодx => x.Entity.Name
вThenBy
Я получаю заказ, который хочу, ноorderBy
обеспечивается вызывающим классом запроса, поэтому я неЯ не хочу, чтобы это было жестко закодировано. У меня это жестко закодировано в приведенном выше примере только для простоты объяснения.