Sono stato in grado di farlo funzionare attraverso tentativi ed errori. Il trucco è che il tuo oggetto dati deve avere già un campo che conterrà il MetaTextScore
valore. Quindi data l'interfaccia:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
la funzione finale si presenta così:
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;
}
}
Vale la pena notare che TextMatchScore
non può avere un [BsonIgnore]
decorazione, o ci sarà un'eccezione. Tuttavia, può avere un [BsonIgnoreIfNull]
decorazione. Quindi, eliminando il valore dall'oggetto dati prima di restituirlo, l'oggetto dati può essere salvato nuovamente nella raccolta senza inserire un valore spazzatura.