Я стараюсь избегать ручного сопоставления моих моделей с моделями представления при использовании агрегации и проекции драйвера mongo c # (v2.7.2).
Вместо ручного сопоставления проекции
var projection = Builders<Model>.Projection.Expression(x => new ViewModel {
A = x.A,
B = x.B
// ...more properties
});
я хочу использовать AutoMapper, чтобы сделать отображение
var projection = Builders<Model>.Projection.Expression(x => _mapper.Map<ViewModel>(x));
И на самом деле, это работает, когда я просто использую его для операции find (), подобной этой
var result = mongoCollection
.Find(Builders<Model>.Filter.Empty)
.Project(projection)
.ToList();
Но когда я использую ту же проекцию для aggregate ()
var result = mongoCollection
.Aggregate()
.Project(projection)
.ToList();
, создается исключение ArgumentOutOfRangeException
Произошло исключение: CLR / System.ArgumentOutOfRangeException Возникло исключение: 'System.ArgumentOutOfRangeException 'в System.Private.CoreLib.dll:' Индекс был вне диапазона.Должен быть неотрицательным и меньше размера коллекции. '
Прежде всего я хотел бы знать, почему сопоставление с AutoMapper работает для find (), а не для aggregate ()?
А также, если возможно, как-то использовать AutoMapper в этом сценарии, или если есть какой-то другой способ сопоставления с целевым классом без явной десериализации клиентской стороны результата?