public async Task<JsonNetResult> ByUser(GetUserCommentsViewModel model) { // If no user was specified, default to the current logged in user Guid? userId = model.UserId ?? User.GetCurrentUserId(); if (userId == null) { ModelState.AddModelError(string.Empty, "No user specified and no user currently logged in."); return JsonFailure(); } // Get a page of comments for the user, then look up video details for those videos UserComments result = await _comments.GetUserComments(new GetUserComments { UserId = userId.Value, PageSize = model.PageSize, FirstCommentIdOnPage = model.FirstCommentIdOnPage }); // For the ViewModel, we want to add information about the video to each comment as well, so get the video preview // information for the comments and then use a LINQ to objects Join to merge the two together (this should be OK since // the dataset should be small since we're doing a page at a time) IEnumerable<VideoPreview> videoPreviews = await _videoCatalog.GetVideoPreviews(result.Comments.Select(c => c.VideoId).ToHashSet()); var returnModel = new UserCommentsViewModel { UserId = result.UserId, Comments = result.Comments.Join(videoPreviews, c => c.VideoId, vp => vp.VideoId, (c, vp) => new UserCommentViewModel { CommentId = c.CommentId, Comment = c.Comment, CommentTimestamp = c.CommentTimestamp, VideoViewUrl = Url.Action("View", "Videos", new { videoId = c.VideoId }), VideoName = vp.Name, VideoPreviewImageLocation = vp.PreviewImageLocation }).ToList() }; return JsonSuccess(returnModel); }