Обычно мы добавляем индексы с помощью таких построителей
var keys = Builders<DocumentFolder>.IndexKeys.Ascending("Property1").Descending("Property2");
var opts = new CreateIndexOptions();
opts.Unique = false;
Collection.Indexes.CreateOne(keys, opts);
Я пытаюсь сделать это более общим для динамической коллекции, которую мы добавляем, поэтому я попробовал это
var Indexes = new Dictionary<string, string> {
{"Property1", "A"},
{"Property2", "D"}
};
var keys = Indexes.Aggregate(Builders<BsonDocument>.IndexKeys,
(current, next) => next.Value == "A" ?
current.Ascending(next.Key) : current.Descending(next.Key));
Collection.Indexes.CreateOne(keys, new CreateIndexOptions {Unique = isUnique});
Но я получаю ошибку «Невозможно неявно преобразовать тип MongoDB.Driver.IndexKeysDefinition в MongoDB.Driver.IndexKeysDefinitionBuilder». Насколько я понимаю, оба сегмента кода должны возвращать эквивалентные объекты. Я ошибаюсь или у меня что-то не так в моем коде?





Поэтому я попытался заставить Aggregate работать, но никак не мог заставить его работать. Я предполагаю, что это имеет какое-то отношение к тому, что Ascending / Descending возвращает тип, отличный от IndexKeys. Но это работает.
IndexKeysDefinitionBuilder<BsonDocument> builder = Builders<BsonDocument>.IndexKeys;
List<IndexKeysDefinition<BsonDocument>> definitions =
Indexes.Select(index => index.Value == "A" ?
builder.Ascending(index.Key) :
builder.Descending(index.Key)).ToList();
IndexKeysDefinition<BsonDocument> keys =
Builders<BsonDocument>.IndexKeys.Combine(definitions);
Collection.Indexes.CreateOne(keys, new CreateIndexOptions {Unique = isUnique});
Я оставлю это открытым на некоторое время, если кто-то сможет выполнить совокупную работу, я приму их ответ, поскольку это был исходный вопрос.