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); }
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); }