Jag kunde få det här att fungera genom försök och misstag. Tricket är att ditt dataobjekt redan måste ha ett fält på sig som innehåller MetaTextScore
värde. Så givet gränssnittet:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
den slutliga funktionen ser ut så här:
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 är värt att notera att TextMatchScore
kan inte ha en [BsonIgnore]
dekoration, annars kommer det att finnas ett undantag. Den kan dock ha en [BsonIgnoreIfNull]
dekoration. Så genom att skrubba bort värdet från dataobjektet innan det ger det, kan dataobjektet sparas tillbaka i samlingen utan att lägga in ett skräpvärde.