public async Task <IActionResult> SearchPosts(string word, int page) { word ??= ""; page = Math.Max(0, page); const int pageSize = 20; var query = from p in Context.Posts where p.Tsv.Matches(EF.Functions.WebSearchToTsQuery("testzhcfg", word)) join q in Context.Users on p.SenderId equals q.Id select new { post = p, user = q, replyCount = Context.Replies.Count(z => z.PostId == p.Id), lastReply = Context.Replies.Where(z => z.PostId == p.Id) .DefaultIfEmpty().Max(p => p == null ? -2 : p.CreatedAt) }; query = query .OrderByDescending(p => p.post.Tsv.RankCoverDensity(EF.Functions.WebSearchToTsQuery("testzhcfg", word))) .Skip(pageSize * page).Take(pageSize); var data = await query.ToListAsync(); var qposts = data.Select( p => QPost.NormalView(p.post, QUser.NormalView(p.user), p.replyCount, p.lastReply)).ToList(); return(Ok(qposts)); }
public async Task <IActionResult> GetPostById(string id) { var postId = XUtils.ParseId(id); if (postId == null) { return(new ApiError(MyErrorCode.IdNotFound, "Id parse error").Wrap()); } var query = from p in Context.Posts where p.Id == postId join q in Context.Users on p.SenderId equals q.Id select new { post = p, user = q, replyCount = Context.Replies.Count(z => z.PostId == p.Id), lastReply = Context.Replies.Where(z => z.PostId == p.Id) .DefaultIfEmpty().Max(p => p == null ? -2 : p.CreatedAt) }; var data = await query.FirstOrDefaultAsync(); var qpost = QPost.NormalView(data.post, QUser.NormalView(data.user), data.replyCount, data.lastReply); return(Ok(qpost)); }
public async Task <IActionResult> GetPosts(string topicId, int page) { const int pageSize = 20; page = Math.Max(0, page); var tid = XUtils.ParseId(topicId); if (tid == null) { return(new ApiError(MyErrorCode.IdNotFound, "topicId parse error").Wrap()); } var query = from p in Context.Posts where p.TopicId == tid join q in Context.Users on p.SenderId equals q.Id select new { post = p, user = q, replyCount = Context.Replies.Count(z => z.PostId == p.Id), lastReply = Context.Replies.Where(z => z.PostId == p.Id) .DefaultIfEmpty().Max(p => p == null ? -2 : p.CreatedAt) }; query = query.OrderByDescending(p => p.post.IsPinned) .ThenByDescending(p => p.lastReply) .Skip(page * pageSize) .Take(pageSize); var data = await query.ToListAsync(); var qposts = data.Select( p => QPost.NormalView(p.post, QUser.NormalView(p.user), p.replyCount, p.lastReply)).ToList(); return(Ok(qposts)); }