說我有,我想和排名應用於查詢實體:我該如何轉換這個linq表達式?
public class Person: Entity
{
public int Id { get; protected set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
在我的查詢我有以下幾點:
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();
我曾嘗試與選擇匿名對象之前對結果進行排序Rank
屬性,但排序結束了迷路。似乎linq實體放棄了單獨集合的排序,並在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
由查詢的調用類提供,所以我不想將其硬編碼。我在上面的示例中對其進行了硬編碼僅爲解釋的簡單。
刪除我的答案,以便您可以嘗試回收賞金。如果您在授予Aron後會發佈後續評論,我會重新發布我的答案,以防將來幫助任何人。順便說一句,你是否嘗試我的解決方案,如果是的話,它的工作? –
@MikeStrobel謝謝,我真的很感激。您可以繼續並單獨重新發布您的答案,請不要取消刪除您刪除的那個。我仍然在等待賞金,我可以重新授予獎勵。 – danludwig
在這裏使用強類型的佔位符類會節省很多麻煩。 –