public async Task <ListResponseModel <TModel> > GetListPostCategoryAsync <TModel>(
            ListPostCategoryRequestModel requestModel, ParsingConfig parsingConfig = null)
        {
            #region Validation
            var userInfo       = contextProvider.BusinessContext.PrincipalInfo;
            var validationData = new ValidationData(resultLocalizer);

            // validation logic here

            if (!validationData.IsValid)
            {
                throw validationData.BuildException();
            }
            #endregion

            IQueryable <PostCategoryEntity>        query = dbContext.PostCategory.AsNoTracking();
            IQueryable <ListPostCategoryJoinModel> joinedQuery;

            #region Filter
            if (requestModel.Ids?.Any() == true)
            {
                query = query.ByIds(requestModel.Ids);
            }

            string lang   = requestModel.Lang;
            string region = requestModel.Region;
            if (string.IsNullOrEmpty(lang))
            {
                lang = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
            }

            var locQuery = dbContext.PostCategoryLocalization.ByCulture(lang, region);

            joinedQuery = from pc in query
                          from pcl in locQuery.Where(o => o.EntityId == pc.Id).Take(1).DefaultIfEmpty()
                          select new ListPostCategoryJoinModel
            {
                CreatedTime = pc.CreatedTime,
                Description = pcl.Description,
                Id          = pc.Id,
                Lang        = pcl.Lang,
                Region      = pcl.Region,
                Title       = pcl.Title
            };

            if (!string.IsNullOrWhiteSpace(requestModel.SearchTerm))
            {
                joinedQuery = joinedQuery.BySearchTerm(requestModel.SearchTerm);
            }
            #endregion

            var orgQuery = joinedQuery;

            #region Sorting
            var sortByArr = requestModel.GetSortByArr();
            if (!sortByArr.IsNullOrEmpty())
            {
                foreach (var field in sortByArr)
                {
                    var asc       = field[0] == QueryConsts.SortAscPrefix;
                    var fieldName = field.Remove(0, 1);

                    switch (fieldName)
                    {
                    case ListPostCategoryRequestModel.SortByTitle:
                    {
                        if (asc)
                        {
                            joinedQuery = joinedQuery.SequentialOrderBy(o => o.Title);
                        }
                        else
                        {
                            joinedQuery = joinedQuery.SequentialOrderByDesc(o => o.Title);
                        }
                    }
                    break;

                    default:
                        throw AppValidationException.From(resultLocalizer, ResultCode.InvalidPagingRequest);
                    }
                }
            }
            #endregion

            if (requestModel.Page > 0)
            {
                joinedQuery = joinedQuery.Limit(requestModel.Page, requestModel.PageLimit);
            }

            #region Projection
            var projectionArr = requestModel.GetFieldsArr().Select(o => ListPostCategoryRequestModel.Projections[o]).ToArray();
            var projectionStr = string.Join(',', projectionArr);

            var projectedQuery = joinedQuery.Select <TModel>(
                parsingConfig ?? DynamicLinqConsts.DefaultParsingConfig,
                $"new {typeof(TModel).FullName}({projectionStr})");
            #endregion

            var responseModels = await projectedQuery.ToArrayAsync();

            var response = new ListResponseModel <TModel>
            {
                List = responseModels,
            };

            if (requestModel.CountTotal)
            {
                response.TotalCount = await orgQuery.CountAsync();
            }

            return(response);
        }
        public async Task <IActionResult> GetListPostCategory([FromQuery] ListPostCategoryRequestModel model)
        {
            var data = await _postCategoryService.GetListPostCategoryAsync <ListPostCategoryModel>(model);

            return(Success(data));
        }