Beispiel #1
0
        public ICollection <NewsItem> SelectFilteredPage(FinalNewsFilter dataFilter, int pageNumber, int pageSize, out int totalCount)
        {
            var res = new List <NewsItem>();
            var db  = GetDb();

            using (var cmd = GetCommand(GetProcedureString(), db))
            {
                FillParams(new
                {
                    pageNumber,
                    pageSize,
                    dataFilter.NewsIds,
                    dataFilter.BlogId,
                    dataFilter.OnlyFutureEventDate,
                    dataFilter.RecordTypes,
                    dataFilter.SortBy,
                    dataFilter.SortOrder,
                    dataFilter.OnlyPosted,
                    totalCount = (int?)null
                }, cmd, db);
                db.SetParameterValue(cmd, "TotalCount", null);

                using (var reader = ExecuteReader(db, cmd))
                {
                    while (reader.Read())
                    {
                        res.Add(ReadRecord <NewsItem>(reader));
                    }
                }
                totalCount = Convert.ToInt32(db.GetParameterValue(cmd, "TotalCount"));
            }
            return(res);
        }
Beispiel #2
0
        public ICollection <NewsItem> GetNewsPage(NewsFilter filter, int pageNumber, int pageSize, out int totalCount)
        {
            ICollection <int> newsIds;

            if (string.IsNullOrWhiteSpace(filter.TextQuery))
            {
                // если поискового запроса нет, забираем айдишники вообще всех новостей
                //TODO: для ускорения можно закэшировать
                newsIds = _newsItemGateway.SelectIds();
            }
            else
            {
                // если есть поисковый запрос, забираем из поискового индекса айдишники нужных
                int searchTotal;
                var searchResults =
                    _searchService.Search(new SearchParams(filter.TextQuery, new Type[] { typeof(NewsItem) }),
                                          out searchTotal, 1, int.MaxValue);
                newsIds = searchResults.Select(x => int.Parse(x.EntityId)).Distinct().ToList();
            }
            if (!newsIds.Any())
            {
                // если после фильтрации ничего не осталось, возвращаем пустой список
                totalCount = 0;
                return(new List <NewsItem>());
            }

            if (!string.IsNullOrEmpty(filter.CategoryQuery))
            {
                newsIds = FilterByCategories(newsIds, filter.CategoryQuery);
                if (!newsIds.Any())
                {
                    // если после фильтрации ничего не осталось, возвращаем пустой список
                    totalCount = 0;
                    return(new List <NewsItem>());
                }
            }

            if (!string.IsNullOrEmpty(filter.TagName))
            {
                newsIds = FilterByTag(newsIds, filter.TagName);
                if (!newsIds.Any())
                {
                    // если после фильтрации ничего не осталось, возвращаем пустой список
                    totalCount = 0;
                    return(new List <NewsItem>());
                }
            }

            var dataFilter = new FinalNewsFilter()
            {
                OnlyPosted          = filter.OnlyPosted,
                NewsIds             = newsIds,
                BlogId              = filter.BlogId,
                OnlyFutureEventDate = filter.OnlyFutureEventDate,
                RecordTypes         = filter.RecordTypes.Select(x => x.ToString()).ToArray(),
                SortBy              = filter.SortBy.ToString(),
                SortOrder           = filter.SortOrder
            };
            var dataRes = _newsItemGateway.SelectFilteredPage(dataFilter, pageNumber, pageSize, out totalCount);
            var res     = Mapper.Map <ICollection <NewsItem> >(dataRes);

            var hearts = _heartService.GetHearts(res.Select(x => x.HeartId));

            foreach (var newsItem in res)
            {
                var heart = hearts.Single(x => x.HeartId == newsItem.HeartId);
                newsItem.FillHeart(heart);
                newsItem.CanonicalUrl = _heartService.GetCanonicalUrl(heart.HeartId);
                FillItem(newsItem);
            }
            return(res);
        }