Consegui fazer isso funcionar por tentativa e erro. O truque é que seu objeto de dados precisa ter um campo já que conterá o
MetaTextScore
valor. Então, dada a interface:interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
a função final fica assim:
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 a pena notar que
TextMatchScore
não pode ter um [BsonIgnore]
decoração, ou haverá uma exceção. No entanto, pode ter um [BsonIgnoreIfNull]
decoração. Portanto, removendo o valor do objeto de dados antes de cedê-lo, o objeto de dados pode ser salvo de volta na coleção sem colocar um valor de lixo.