Исключение IBsonArraySerializer при запросе с использованием ElemMatch - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть новый запрос для коллекции, которая уже извлекает и хранит данные для сконфигурированного типа, и я раньше не сталкивался с этим:

The serializer for field 'BookingRequests' must implement IBsonArraySerializer and provide item serialization info.

У меня есть объект, имеющий следующую структуру:

public class DayBookings : IHasId
{
    public DayBookings()
    {
        BookingRequests = new Dictionary<string, TimestampedRequest<BookingRequest>>();
    }
    public DayBookings(TimestampedRequest<BookingRequest> bookingRequest, string restaurant) : this()
    {
        Id = $"{restaurant}_{bookingRequest.Request.Date.ToString("ddMMyyyy")}";

        Restaurant = restaurant;

        Date = bookingRequest.Request.Date;

        BookingRequests[bookingRequest.RequestId] = bookingRequest;
    }
    public string Id { get; set; }
    public string Restaurant { get; set; }
    public DateTime Date { get; set; }
    public Dictionary<string, TimestampedRequest<BookingRequest>> BookingRequests { get; set; }
}

, где TimestampedRequest - это стандартный объект POCO с общими данными внутри.

Конфигурация для этой коллекции, которую я запускаю при запуске:

if (!BsonClassMap.IsClassMapRegistered(typeof(DayBookings)))
{
    BsonClassMap.RegisterClassMap<DayBookings>(cm =>
    {
        cm.AutoMap();

        cm.SetIdMember(cm.GetMemberMap(c => c.Id));

        var customDictionarySerializer = new DictionaryInterfaceImplementerSerializer<Dictionary<string, TimestampedRequest<BookingRequest>>>(dictionaryRepresentation: DictionaryRepresentation.Document,
                                                                                                                                                          keySerializer: new StringSerializer(BsonType.String),
                                                                                                                                                          valueSerializer: BsonSerializer.SerializerRegistry.GetSerializer<TimestampedRequest<BookingRequest>>());
      cm.GetMemberMap(c => c.BookingRequests)
        .SetSerializer(customDictionarySerializer);
   });

}

Я добавил пользовательский сериализатор для этого поля на тот случай, если он мне понадобился, но он не дал никакого эффекта.

Я пытаюсь выполнить запрос:

public async Task<IEnumerable<DateTime>> GetAllDatesWithUnconfirmedBookings(string restaurant)
        {
            IEnumerable<DateTime> dates = null;

            try
            {
                dates = await Collection.Find(Builders<DayBookings>.Filter.And(
                                                Builders<DayBookings>.Filter.Eq(d => d.Restaurant, restaurant),
                                                Builders<DayBookings>.Filter.Gte(d => d.Date, DateTime.UtcNow.Date),
                                                Builders<DayBookings>.Filter.ElemMatch(d => d.BookingRequests, b => b.Value.Request.Status == Domain.Requests.BookingStatus.Unconfirmed)))
                                        .SortBy(d => d.Date)
                                        .Project(d => d.Date)
                                        .ToListAsync();
            }
            catch (Exception ex)
            {
                Logger.Error(ex, $"Error getting all dates with pending bookings for Restaurant={restaurant}");
            }

            return dates;
        }

Я не смог найти много информации о конфигурации, которую мне пришлось бы установить для поля BookingRequests, поэтому я был бы признателен за помощь здесь.

Большое спасибо!

...