Pude hacer que esto funcionara a través de prueba y error. El truco es que su objeto de datos debe tener un campo que contendrá el MetaTextScore
valor. Así que dada la interfaz:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
la función final se ve así:
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 señalar que TextMatchScore
no puede tener un [BsonIgnore]
decoración, o habrá una excepción. Sin embargo, puede tener un [BsonIgnoreIfNull]
decoración. Entonces, al borrar el valor del objeto de datos antes de entregarlo, el objeto de datos se puede volver a guardar en la colección sin poner un valor basura.