Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ElemMatch进行查询时出现IBMSerializer异常_C#_Mongodb Query_Mongodb .net Driver_Mongodb Csharp 2.0 - Fatal编程技术网

C# 使用ElemMatch进行查询时出现IBMSerializer异常

C# 使用ElemMatch进行查询时出现IBMSerializer异常,c#,mongodb-query,mongodb-.net-driver,mongodb-csharp-2.0,C#,Mongodb Query,Mongodb .net Driver,Mongodb Csharp 2.0,我有一个新的集合查询,该集合已经为配置的类型提取和存储数据,我以前从未遇到过这个查询: The serializer for field 'BookingRequests' must implement IBsonArraySerializer and provide item serialization info. 我拥有的对象具有以下结构: public class DayBookings : IHasId { public DayBookings() {

我有一个新的集合查询,该集合已经为配置的类型提取和存储数据,我以前从未遇到过这个查询:

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; }
}
我为该字段添加了自定义序列化程序,以防需要它,但没有效果

我尝试执行的查询是:

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;
        }
更新:这可能有效


我遇到了另一个字典序列化问题和另一个问题,在寻找了一段时间后,我找到了这个答案:这帮助我解决了序列化问题。事实上,我得到了另一个查询——不是ElemMatch,而是PullFilter——在
字典
上运行良好。我希望这能像对我一样帮助人们

你能解决这个问题吗?@Carlos Torrecillas,你找到解决方案了吗?我改变了查询数据库的方式(目前正在电话中查找代码)。我抑制了elemMatch,改为使用forEachAsync。将编辑问题
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;
        }
public async Task<IEnumerable<DateTime>> GetAllDatesWithUnconfirmedBookingsAsync(string restaurant)
    {
        var dates = new List<DateTime>();

        try
        {
            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)))
                            .SortBy(d => d.Date)
                            .ForEachAsync(d =>
                            {
                                if (d.BookingRequests.Values.Any(b => b.Request.Status == Domain.Requests.BookingStatus.Unconfirmed))
                                {
                                    dates.Add(d.Date);
                                }
                            });
        }
        catch (Exception ex)
        {
            Logger.Error(ex, $"Error getting all dates with pending bookings for Restaurant={restaurant}");
        }

        return dates;
    }