예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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));
        }