Met vallen en opstaan heb ik dit werkend gekregen. De truc is dat je data-object al een veld moet hebben dat de MetaTextScore
bevat. waarde. Dus gezien de interface:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
de uiteindelijke functie ziet er als volgt uit:
public IEnumerable<T> TextSearch<T>(MongoCollection<T> coll, string text) where T:ITextSearchSortable {
var cursor = coll.Find(Query.Text(text))
.SetFields(Fields<T>.MetaTextScore(t => t.TextMatchScore))
.SetSortOrder(SortBy<T>MetaTextScore(t => t.TextMatchScore));
foreach(var t in cursor) {
// prevent saving the value back into the database
t.TextMatchScore = null;
yield return t;
}
}
Het is vermeldenswaard dat TextMatchScore
kan geen [BsonIgnore]
. hebben decoratie, of er zal een uitzondering zijn. Het kan echter een [BsonIgnoreIfNull]
. hebben decoratie. Dus door de waarde van het data-object te schrapen voordat het wordt opgeleverd, kan het data-object weer in de verzameling worden opgeslagen zonder een afvalwaarde in te voeren.