예제 #1
0
        public IAsyncEnumerable <string> Search(ICommentRepository repository, CommentQueryRequest query, CancellationToken cancellationToken = default)
        {
            var qr = repository.GetAllItems(cancellationToken).IgnoreNull();

            if (!string.IsNullOrWhiteSpace(query.Author))
            {
                qr = qr.Where(x => x.Author == query.Author);
            }
            if (!string.IsNullOrWhiteSpace(query.Email))
            {
                qr = qr.Where(x => x.Email == query.Email);
            }
            if (!string.IsNullOrWhiteSpace(query.Link))
            {
                qr = qr.Where(x => x.Link == query.Link);
            }
            if (!string.IsNullOrWhiteSpace(query.Uri))
            {
                qr = qr.Where(x => x.Uri == query.Uri);
            }
            if (!string.IsNullOrWhiteSpace(query.Content))
            {
                qr = qr.Where(x => x.Content.Contains(query.Content));
            }
            if (!string.IsNullOrWhiteSpace(query.Term))
            {
                qr = qr.Where(x =>
                              x.Author.Contains(query.Term) ||
                              x.Content.ToString().Contains(query.Term)
                              );
            }

            return(qr.Select(item => item.Id).IgnoreNull().Paging(query.Pagination));
        }
예제 #2
0
        public async Task <QueryStatistic> Statistic(CommentQueryRequest query, CancellationToken cancellationToken = default)
        {
            var innerQuery = ToInnerQuery(query);
            var count      = await Service.Count(innerQuery, cancellationToken).ConfigureAwait(false);

            return(new QueryStatistic
            {
                Count = (int)count
            });
        }
예제 #3
0
        public async IAsyncEnumerable <string> Query(CommentQueryRequest query, [EnumeratorCancellation] CancellationToken cancellationToken = default)
        {
            var innerQuery = ToInnerQuery(query);

            var items = await Service.Query(innerQuery, cancellationToken).ConfigureAwait(false);

            foreach (var item in items.Select(x => x.Id))
            {
                yield return(item);
            }
        }
예제 #4
0
        static Loment.Models.CommentQuery ToInnerQuery(CommentQueryRequest query)
        {
            var pagination = query.Pagination ?? new Pagination
            {
                PageSize    = int.MaxValue,
                CurrentPage = 0
            };

            var innerQuery = new Loment.Models.CommentQuery
            {
                Author  = query.Author,
                Content = query.Content,
                Email   = query.Email,
                Link    = query.Link,
                Uri     = query.Uri,
                Offset  = pagination.Offset,
                Limit   = pagination.PageSize,
            };

            return(innerQuery);
        }