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;
}