public async Task <IActionResult> Get(int from = 0, int size = 20) { var issues = (await _issuesQueries.GetTopLastIssues(from, size)).ToList(); var userIds = issues.Select(i => i.UserId).Distinct(); var users = await _userQueries.GetUsersById(userIds); var ridesRequest = issues.Select(i => new RidesByUserBike { UserId = i.UserId, BikeId = i.BikeId }).Distinct(); var rides = await _ridesQueries.GetRidesByUserAndBike(ridesRequest); var userById = users.ToDictionary(i => i.UserId, u => u); var ridesByUserAndBike = rides.GroupBy(r => new { BikeId = r.Bike.BikeId, UserId = r.UserId }) .ToDictionary(x => $"{x.Key.BikeId}-{x.Key.UserId}", x => x.First()); var issuesByKey = issues .GroupBy(i => new { BikeId = i.BikeId, UserId = i.UserId }) .ToDictionary(x => $"{x.Key.BikeId}-{x.Key.UserId}", x => x.First()); SetCountPaginationHeader(issuesByKey.Count()); var response = issuesByKey .Select((keypair) => { var issue = keypair.Value; var key = keypair.Key; var user = userById.ContainsKey(issue.UserId) ? userById[issue.UserId] : null; var ride = ridesByUserAndBike.ContainsKey(key) ? ridesByUserAndBike[key] : null; return(MapIssue(issue, user, ride)); }); return(Ok(response)); }
public async Task <IActionResult> Get(int from = 0, int size = 20) { // BREAKPOINT // get collections of issues, users, requests and merge the collections together var issues = (await _issuesQueries.GetTopLastIssues(from, size)).ToList(); var userIds = issues.Select(i => i.UserId).Distinct(); var ridesRequest = issues.Select(i => new RidesByUserBike { UserId = i.UserId, BikeId = i.BikeId }).Distinct(); var rides = await _ridesQueries.GetRidesByUserAndBike(ridesRequest); var result = MergeIssuesAndRides(issues, rides); SetCountPaginationHeader(result.Count()); var response = result; return(Ok(response)); }