Ich konnte das durch Versuch und Irrtum zum Laufen bringen. Der Trick besteht darin, dass Ihr Datenobjekt bereits ein Feld enthalten muss, das den MetaTextScore
enthält Wert. Also angesichts der Schnittstelle:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
die endgültige Funktion sieht so aus:
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;
}
}
Es ist erwähnenswert, dass TextMatchScore
darf kein [BsonIgnore]
haben Dekoration, oder es wird eine Ausnahme geben. Es kann jedoch einen [BsonIgnoreIfNull]
haben Dekoration. Indem also der Wert aus dem Datenobjekt entfernt wird, bevor es zurückgegeben wird, kann das Datenobjekt wieder in der Sammlung gespeichert werden, ohne einen Müllwert einzufügen.