Как указано в документации драйвера MongoDB C # (из вставленной ссылки):
Драйвер содержит реализацию LINQ, предназначенную для структуры агрегации .
Таким образом, должна быть соответствующая операция в Aggregation Framework для перевода из LINQ.Вы вызываете .AsQueryable()
, что означает, что вы можете построить свое выражение, используя синтаксис LINQ, но затем оно завершается неудачно, когда его необходимо преобразовать в Aggregation Framework.К сожалению, вы не можете иметь выражения внутри $ sort , и поэтому ваш код потерпит неудачу.
Чтобы исправить это, вы можете использовать $ addFields stage, чтобы добавить одно дополнительное полеMatchesParent
и сортировка по этому полю.
Предполагая, что ваша модель представлена следующим классом:
public class Model
{
[BsonId]
public ObjectId Id { get; set; }
public string ParentId { get; set; }
// some other properties
}
, вы можете добавить следующий класс:
public class ModelResult: Model
{
public bool MatchesParent { get; set; }
}
Итогда вы можете определить $addFields
как оператор PipelineStageDefinition
и nameof
, чтобы он оставался строго набранным:
PipelineStageDefinition<Model, ModelResult> addFields = new BsonDocument() {
{ "$addFields", new BsonDocument() {
{ nameof(ModelResult.MatchesParent), new BsonDocument() {
{ "$eq", new BsonArray() { "$" + nameof(Model.ParentId), someParentId } }
}
}
}
}
};
var result = Col.Aggregate()
.Match(expression)
.AppendStage(addFields)
.SortByDescending(x => x.MatchesParent)
.ToList();