public async Task <SearchInGroupResult> GetInGroupAsync(FeedFilter filter) { var canFilterArticle = !filter.FilterType.HasValue || filter.FilterType == FeedFilterType.Article; var articleQuery = _articleRepository.Get(x => canFilterArticle).Where(x => (x.StatusId == _articleDeletedStatus && filter.CanGetDeleted) || (x.StatusId == _articleInactivedStatus && filter.CanGetInactived) || (x.StatusId != _articleDeletedStatus && x.StatusId != _articleInactivedStatus)); var canFilterProduct = !filter.FilterType.HasValue || filter.FilterType == FeedFilterType.Product; var productQuery = _productRepository.Get(x => canFilterProduct).Where(x => (x.StatusId == _productDeletedStatus && filter.CanGetDeleted) || (x.StatusId == _productInactivedStatus && filter.CanGetInactived) || (x.StatusId != _productDeletedStatus && x.StatusId != _productInactivedStatus)); var canFilterFarm = !filter.FilterType.HasValue || filter.FilterType == FeedFilterType.Farm; var farmQuery = _farmRepository.Get(x => canFilterFarm).Where(x => (x.StatusId == _farmDeletedStatus && filter.CanGetDeleted) || (x.StatusId == _farmInactivedStatus && filter.CanGetInactived) || (x.StatusId != _farmDeletedStatus && x.StatusId != _farmInactivedStatus)); var canFilterUser = !filter.FilterType.HasValue || filter.FilterType == FeedFilterType.User; var userQuery = _userRepository.Get(x => canFilterUser).Where(x => x.IsEmailConfirmed && (filter.CanGetInactived || x.StatusId == _userActivedStatus)); if (!string.IsNullOrEmpty(filter.Keyword)) { filter.Keyword = filter.Keyword.ToLower(); if (canFilterArticle) { articleQuery = articleQuery.Where(x => x.Name.ToLower().Contains(filter.Keyword) || x.Description.ToLower().Contains(filter.Keyword)); } if (canFilterProduct) { productQuery = productQuery.Where(x => x.Name.ToLower().Contains(filter.Keyword) || x.Description.ToLower().Contains(filter.Keyword)); } if (canFilterFarm) { farmQuery = farmQuery.Where(x => x.Name.ToLower().Contains(filter.Keyword) || x.Description.ToLower().Contains(filter.Keyword)); } if (canFilterUser) { userQuery = userQuery.Where(x => x.Lastname.ToLower().Contains(filter.Keyword) || x.Firstname.ToLower().Contains(filter.Keyword) || (x.Lastname + " " + x.Firstname).ToLower().Contains(filter.Keyword) || (x.Firstname + " " + x.Lastname).ToLower().Contains(filter.Keyword)); } } if (filter.CreatedById.HasValue) { articleQuery = articleQuery.Where(x => x.CreatedById == filter.CreatedById); productQuery = productQuery.Where(x => x.CreatedById == filter.CreatedById); farmQuery = farmQuery.Where(x => x.CreatedById == filter.CreatedById); userQuery = userQuery.Where(x => x.CreatedById == filter.CreatedById); } if (filter.CreatedDateFrom.HasValue && filter.CreatedDateTo.HasValue) { articleQuery = articleQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom && x.CreatedDate <= filter.CreatedDateTo); productQuery = productQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom && x.CreatedDate <= filter.CreatedDateTo); farmQuery = farmQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom && x.CreatedDate <= filter.CreatedDateTo); userQuery = userQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom && x.CreatedDate <= filter.CreatedDateTo); } else if (filter.CreatedDateTo.HasValue) { articleQuery = articleQuery.Where(x => x.CreatedDate <= filter.CreatedDateTo); productQuery = productQuery.Where(x => x.CreatedDate <= filter.CreatedDateTo); farmQuery = farmQuery.Where(x => x.CreatedDate <= filter.CreatedDateTo); userQuery = userQuery.Where(x => x.CreatedDate <= filter.CreatedDateTo); } else if (filter.CreatedDateFrom.HasValue) { articleQuery = articleQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom); productQuery = productQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom); farmQuery = farmQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom); userQuery = userQuery.Where(x => x.CreatedDate >= filter.CreatedDateFrom); } var articleFeeds = (from article in articleQuery select new FeedResult() { CreatedById = article.CreatedById, CreatedDate = article.CreatedDate, Description = string.IsNullOrEmpty(article.Description) ? article.Content : article.Description, Id = article.Id.ToString(), Name = article.Name, FeedType = FeedType.Article, }); var productFeeds = (from product in productQuery join pr in _productPriceRepository.Get(x => x.IsCurrent) on product.Id equals pr.ProductId into prices from price in prices.DefaultIfEmpty() select new FeedResult { CreatedById = product.CreatedById, CreatedDate = product.CreatedDate, Description = product.Description, Id = product.Id.ToString(), Name = product.Name, FeedType = FeedType.Product, Price = price != null ? price.Price : 0, }); var farmFeeds = (from farm in farmQuery select new FeedResult() { CreatedById = farm.CreatedById, CreatedDate = farm.CreatedDate, Description = farm.Description, Id = farm.Id.ToString(), Name = farm.Name, FeedType = FeedType.Farm, Address = farm.Address, }); var userFeeds = (from user in userQuery select new FeedResult() { CreatedById = user.CreatedById, CreatedDate = user.CreatedDate, Description = user.UserInfo.Description, Id = user.Id.ToString(), Name = user.Lastname + " " + user.Firstname, FeedType = FeedType.User, Address = user.UserInfo.Address, }); var countingTasks = new List <Task <CountingTask> >(); countingTasks.Add(Task.Run(async() => { return(new CountingTask { TaskName = FeedType.Article.ToString(), TotalResult = await articleFeeds.CountAsync() }); })); countingTasks.Add(Task.Run(async() => { return(new CountingTask { TaskName = FeedType.Product.ToString(), TotalResult = await productFeeds.CountAsync() }); })); countingTasks.Add(Task.Run(async() => { return(new CountingTask { TaskName = FeedType.Farm.ToString(), TotalResult = await farmFeeds.CountAsync() }); })); countingTasks.Add(Task.Run(async() => { return(new CountingTask { TaskName = FeedType.User.ToString(), TotalResult = await userFeeds.CountAsync() }); })); await Task.WhenAll(countingTasks); var totalUser = countingTasks.FirstOrDefault(x => x.Result.TaskName == FeedType.User.ToString()).Result.TotalResult; var totalFarm = countingTasks.FirstOrDefault(x => x.Result.TaskName == FeedType.Farm.ToString()).Result.TotalResult; var totalArticle = countingTasks.FirstOrDefault(x => x.Result.TaskName == FeedType.Article.ToString()).Result.TotalResult; var totalProduct = countingTasks.FirstOrDefault(x => x.Result.TaskName == FeedType.Product.ToString()).Result.TotalResult; var feedTasks = new List <Task <List <FeedResult> > >(); feedTasks.Add(Task.Run(async() => { int page = filter.Page; int pageSize = filter.PageSize; return(await userFeeds .OrderByDescending(x => x.CreatedDate) .Skip(pageSize * (page - 1)) .Take(pageSize) .ToListAsync()); })); feedTasks.Add(Task.Run(async() => { int page = filter.Page; int pageSize = filter.PageSize; return(await articleFeeds .OrderByDescending(x => x.CreatedDate) .Skip(pageSize * (page - 1)) .Take(pageSize) .ToListAsync()); })); feedTasks.Add(Task.Run(async() => { int page = filter.Page; int pageSize = filter.PageSize; return(await productFeeds .OrderByDescending(x => x.CreatedDate) .Skip(pageSize * (page - 1)) .Take(pageSize) .ToListAsync()); })); feedTasks.Add(Task.Run(async() => { int page = filter.Page; int pageSize = filter.PageSize; return(await farmFeeds .OrderByDescending(x => x.CreatedDate) .Skip(pageSize * (page - 1)) .Take(pageSize) .ToListAsync()); })); await Task.WhenAll(feedTasks); var articles = feedTasks.SelectMany(x => x.Result.Where(r => r.FeedType == FeedType.Article)).ToList(); var products = feedTasks.SelectMany(x => x.Result.Where(r => r.FeedType == FeedType.Product)).ToList(); var farms = feedTasks.SelectMany(x => x.Result.Where(r => r.FeedType == FeedType.Farm)).ToList(); var users = feedTasks.SelectMany(x => x.Result.Where(r => r.FeedType == FeedType.User)).ToList(); var result = new SearchInGroupResult { Articles = articles, TotalArticle = totalArticle, TotalArticlePage = (int)Math.Ceiling((double)totalArticle / filter.PageSize), Products = products, TotalProduct = totalProduct, TotalProductPage = (int)Math.Ceiling((double)totalProduct / filter.PageSize), Farms = farms, TotalFarm = totalFarm, TotalFarmPage = (int)Math.Ceiling((double)totalFarm / filter.PageSize), Users = users, TotalUser = totalUser, TotalUserPage = (int)Math.Ceiling((double)totalUser / filter.PageSize), }; return(result); }
private async Task SetPicturesForSearchResultAsync(SearchInGroupResult groupOfSearch, IEnumerable <UserResult> createdByUsers = null, IList <UserPhotoResult> createdByPictures = null) { // Get articles pictures var articleIds = groupOfSearch.Articles.Select(x => long.Parse(x.Id)); var articlePictures = await _articlePictureRepository .GetArticlePicturesByArticleIdsAsync(articleIds, new IdRequestFilter <long>(), ArticlePictureType.Thumbnail); foreach (var article in groupOfSearch.Articles) { SetFeedCreatedPicture(article, createdByPictures); SetFeedCreatedByName(article, createdByUsers); var articlePicture = articlePictures.FirstOrDefault(x => x.ArticleId == long.Parse(article.Id)); if (articlePicture != null) { article.PictureId = articlePicture.PictureId.ToString(); } } // Get product pictures var productIds = groupOfSearch.Products.Select(x => long.Parse(x.Id)); var productPictures = await _productPictureRepository .GetProductPicturesByProductIdsAsync(productIds, new IdRequestFilter <long>(), ProductPictureType.Thumbnail); foreach (var product in groupOfSearch.Products) { SetFeedCreatedPicture(product, createdByPictures); SetFeedCreatedByName(product, createdByUsers); var productPicture = productPictures.FirstOrDefault(x => x.ProductId == long.Parse(product.Id)); if (productPicture != null) { product.PictureId = productPicture.PictureId.ToString(); } } // Get farm pictures var farmIds = groupOfSearch.Farms.Select(x => long.Parse(x.Id)); var farmPictures = await _farmPictureRepository .GetFarmPicturesByFarmIdsAsync(farmIds, new IdRequestFilter <long>(), FarmPictureType.Thumbnail); foreach (var farm in groupOfSearch.Farms) { SetFeedCreatedPicture(farm, createdByPictures); SetFeedCreatedByName(farm, createdByUsers); var farmPicture = farmPictures.FirstOrDefault(x => x.FarmId == long.Parse(farm.Id)); if (farmPicture != null) { farm.PictureId = farmPicture.PictureId.ToString(); } } // Get user avatar pictures var userIds = groupOfSearch.Users.Select(x => long.Parse(x.Id)); var userPictures = await _userPhotoRepository.GetUserPhotoByUserIdsAsync(userIds, UserPictureType.Avatar); foreach (var user in groupOfSearch.Users) { var userPicture = userPictures.FirstOrDefault(x => x.UserId == long.Parse(user.Id)); if (userPicture != null) { user.PictureId = userPicture.Code; } } }