public async Task <PagedList <OknObjectEvent> > GetObjectEvents(ListObjectEventsQuery query, CancellationToken cancellationToken) { var filter = Builders <ObjectEntity> .Filter.Where(x => x.ObjectId == query.ObjectId); var objectEntity = await _context.Objects.Find(filter).SingleOrDefaultAsync(cancellationToken); if (objectEntity?.Events == null) { return(null); } var count = objectEntity.Events.Count; var items = objectEntity.Events.AsQueryable() .OrderByDescending(x => x.OccuredAt) .Skip((query.Page - 1) * query.PerPage) .Take(query.PerPage).ToList(); var model = _mapper.Map <List <ObjectEventEntity>, List <OknObjectEvent> >(items); var paged = new PagedList <OknObjectEvent> { Data = model, Page = query.Page, PerPage = query.PerPage, Total = count }; return(paged); }
public async Task <PagedList <OknObject> > GetLastObjectEvents(ListObjectEventsQuery query, CancellationToken cancellationToken) { var pipeline = new[] { new BsonDocument("$unwind", "$events"), new BsonDocument("$sort", new BsonDocument("events.occuredAt", -1)), new BsonDocument("$limit", query.PerPage), new BsonDocument("$skip", (query.Page - 1) * query.PerPage), new BsonDocument("$addFields", new BsonDocument("lastEvent", "$events")), new BsonDocument("$project", new BsonDocument { { "events", 0 }, { "photos", 0 }, { "versionInfo", 0 }, { "federal", 0 } }) }; var result = await _context.Objects .Aggregate <ObjectEntity>(pipeline, cancellationToken : cancellationToken) .ToListAsync(cancellationToken: cancellationToken); var model = _mapper.Map <List <ObjectEntity>, List <OknObject> >(result); var paged = new PagedList <OknObject> { Data = model, Page = query.Page, PerPage = query.PerPage, Total = result.Count }; return(paged); }