Podařilo se mi to získat pomocí pokusů a omylů. Trik je v tom, že váš datový objekt již musí mít pole, které bude obsahovat MetaTextScore
hodnota. Takže vzhledem k rozhraní:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
konečná funkce vypadá takto:
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;
}
}
Stojí za zmínku, že TextMatchScore
nemůže mít [BsonIgnore]
dekorace, nebo bude výjimka. Může však mít [BsonIgnoreIfNull]
dekorace. Takže odstraněním hodnoty z datového objektu před jejím poskytnutím lze datový objekt uložit zpět do kolekce, aniž by bylo nutné vložit nesmyslnou hodnotu.