protected override async Task <ItemList <ErrandDto> > Handle(RequestContext context, GetErrandListQuery request, CancellationToken cancellationToken) { if (context.CurrentUser.Role == UserRole.Employee) { return(await mediator.Send(new GetEmployeeErrandListQuery(), cancellationToken)); } var query = GetErrandsQuery(); var totalCount = await query.CountAsync(cancellationToken); var errands = await query .Skip(request.Skip ?? 0) .Take(request.Take ?? 10) .ToListAsync(cancellationToken: cancellationToken); var points = errands.SelectMany(e => e.Points).Select(p => p.Point.Id).Distinct().ToList(); var values = await db.PointFieldValues .Where(c => points.Contains(c.PointId)) .AsNoTracking() .ToListAsync(cancellationToken: cancellationToken); var lastValueBucket = new LastValueBucket(values); var items = new List <ErrandDto>(); foreach (var group in errands.GroupBy(e => new { e.FacilityId, e.EmployeeId })) { var notExpired = group.Where(e => e.Expired(context.CurrentDateTime) == false); items.AddRange(notExpired.OrderByDescending(e => e.DueDate).Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, false))); var expired = group.Except(notExpired).OrderByDescending(e => e.DueDate); var shift = notExpired.Any(e => e.DueDate.Date == context.CurrentDateTime.Date) ? 0 : 1; items.AddRange(expired.OrderByDescending(e => e.DueDate).Take(shift).Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, false))); items.AddRange(expired.OrderByDescending(e => e.DueDate).Skip(shift).Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, true))); } return(new ItemList <ErrandDto> { Items = items, TotalCount = totalCount }); }
protected override async Task <ItemList <ErrandDto> > Handle(RequestContext context, GetEmployeeErrandListQuery request, CancellationToken cancellationToken) { var query = GetErrandsQuery(context.CurrentUser); var errands = FilterExpired(await query.ToListAsync(cancellationToken: cancellationToken), context.CurrentDateTime) .OrderByDescending(e => e.DueDate) .ToList(); var points = errands.SelectMany(e => e.Points).Select(p => p.Point.Id).Distinct().ToList(); var values = await db.PointFieldValues .Where(c => points.Contains(c.PointId)) .AsNoTracking() .ToListAsync(cancellationToken: cancellationToken); var lastValueBucket = new LastValueBucket(values); return(new ItemList <ErrandDto> { Items = errands.Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, false)), TotalCount = errands.Count }); }