Jeg var i stand til at få dette til at fungere gennem forsøg og fejl. Tricket er, at dit dataobjekt allerede skal have et felt på sig, der skal indeholde MetaTextScore
værdi. Så givet grænsefladen:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
den endelige funktion ser således ud:
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;
}
}
Det er værd at bemærke, at TextMatchScore
kan ikke have en [BsonIgnore]
dekoration, ellers vil der være en undtagelse. Den kan dog have en [BsonIgnoreIfNull]
dekoration. Så ved at skrubbe værdien af dataobjektet, før det afgives, kan dataobjektet gemmes tilbage i samlingen uden at indsætte en skraldværdi.