internal PrintedEditionRequestParameters MapToRequestParameters()
        {
            PrintedEditionRequestParameters parameters = new PrintedEditionRequestParameters();

            if (Page != default(int))
            {
                parameters.Page = Page;
            }
            if (PageSize != default(int))
            {
                parameters.PageSize = PageSize;
            }
            if (!string.IsNullOrWhiteSpace(KeyWord))
            {
                parameters.KeyWord = KeyWord;
            }
            if (PriceFrom != default(int))
            {
                parameters.PriceFrom = PriceFrom;
            }
            if (PriceTo != default(int))
            {
                parameters.PriceTo = PriceTo;
            }
            if (SortCriteria != SortCriteria.None)
            {
                parameters.SortCriteria = SortCriteria;
            }
            if (PrintedEditionType != PrintedEditionType.None)
            {
                parameters.PrintedEditionType = PrintedEditionType;
            }
            return(parameters);
        }
        public async Task <PrintedEditionResponseModel> GetAsync(PrintedEditionRequestModel requestModel)
        {
            PrintedEditionRequestParameters parameters = requestModel.MapToRequestParameters();

            (List <PrintedEditionWithNestedObjects> printedEditions, int count) = await _printedEditionRepository.GetWithNestedObjectsAsync(parameters);

            PrintedEditionResponseModel responseModel = new PrintedEditionResponseModel(count, printedEditions);

            return(responseModel);
        }
示例#3
0
        public async Task <(List <PrintedEditionWithNestedObjects>, int)> GetWithNestedObjectsAsync(PrintedEditionRequestParameters requestParameters)
        {
            IQueryable <PrintedEditionWithNestedObjects> printedEditions = _dbSet.GroupJoin(_context.AuthorInBooks.Include(item => item.Author),
                                                                                            outerKeySelector => outerKeySelector.Id,
                                                                                            innerKeySelector => innerKeySelector.PrintedEditionId,
                                                                                            (printedEdition, authorInBooks) => new PrintedEditionWithNestedObjects
            {
                PrintedEdition = printedEdition,
                AuthorInBooks  = authorInBooks.ToList()
            });

            printedEditions = printedEditions.Where(item => (item.PrintedEdition.Price >= requestParameters.PriceFrom && item.PrintedEdition.Price <= requestParameters.PriceTo));

            if (!string.IsNullOrWhiteSpace(requestParameters.KeyWord))
            {
                printedEditions = printedEditions.Where(item => (item.PrintedEdition.Name.Contains(requestParameters.KeyWord) || item.PrintedEdition.Description.Contains(requestParameters.KeyWord)));
            }

            if (requestParameters.PrintedEditionType != PrintedEditionType.None)
            {
                printedEditions = printedEditions.Where(item => item.PrintedEdition.Type == requestParameters.PrintedEditionType);
            }

            if (requestParameters.SortCriteria == SortCriteria.PriceAsc)
            {
                printedEditions = printedEditions.OrderBy(item => item.PrintedEdition.Price);
            }
            if (requestParameters.SortCriteria == SortCriteria.PriceDesc)
            {
                printedEditions = printedEditions.OrderByDescending(item => item.PrintedEdition.Price);
            }
            if (requestParameters.SortCriteria == SortCriteria.CurrencyAsc)
            {
                printedEditions = printedEditions.OrderBy(item => item.PrintedEdition.Currency);
            }
            if (requestParameters.SortCriteria == SortCriteria.CurrencyDesc)
            {
                printedEditions = printedEditions.OrderByDescending(item => item.PrintedEdition.Currency);
            }
            if (requestParameters.SortCriteria == SortCriteria.None)
            {
                printedEditions = printedEditions.OrderByDescending(item => item.PrintedEdition.CreationDate);
            }

            int count = await printedEditions.CountAsync();

            int countToSkip = (--requestParameters.Page) * requestParameters.PageSize;

            printedEditions = printedEditions.Skip(countToSkip).Take(requestParameters.PageSize);

            List <PrintedEditionWithNestedObjects> result = await printedEditions.AsNoTracking().ToListAsync();

            return(result, count);
        }
示例#4
0
        public async Task <(List <PrintedEditionWithNestedObjects>, int)> GetWithNestedObjectsAsync(PrintedEditionRequestParameters parameters)
        {
            int        skipCount  = (parameters.Page - 1) * parameters.PageSize;
            int        count      = default(int);
            SqlBuilder sqlBuilder = new SqlBuilder();

            SqlBuilder.Template countExpression = sqlBuilder.AddTemplate(
                $@"SELECT COUNT (DISTINCT PrintedEditions.Id) FROM PrintedEditions
                LEFT JOIN AuthorInBooks ON PrintedEditions.Id = AuthorInBooks.PrintedEditionId
                LEFT JOIN Authors ON Authors.Id = AuthorInBooks.AuthorId
                /**where**/");

            SqlBuilder.Template itemsExpression = sqlBuilder.AddTemplate(
                $@"SELECT * FROM (SELECT DISTINCT PrintedEditions.* FROM PrintedEditions
                LEFT JOIN AuthorInBooks ON PrintedEditions.Id = AuthorInBooks.PrintedEditionId
                LEFT JOIN Authors ON Authors.Id = AuthorInBooks.AuthorId
                /**where**/ /**orderby**/ ) AS FilteredPrintedEditions
                LEFT JOIN AuthorInBooks ON FilteredPrintedEditions.Id = AuthorInBooks.PrintedEditionId
                LEFT JOIN Authors ON Authors.Id = AuthorInBooks.AuthorId");

            sqlBuilder.Where("PrintedEditions.Price >= @PriceFrom AND PrintedEditions.Price <= @PriceTo");
            if (!string.IsNullOrWhiteSpace(parameters.KeyWord))
            {
                parameters.KeyWord = parameters.KeyWord.ToLower();
                sqlBuilder.Where($@"LOWER(PrintedEditions.Name + ' ' + PrintedEditions.Description) LIKE '%' + @KeyWord + '%'");
            }
            if (parameters.PrintedEditionType != PrintedEditionType.None)
            {
                sqlBuilder.Where("PrintedEditions.Type = @PrintedEditionType");
            }

            count = await _connection.ExecuteScalarAsync <int>(countExpression.RawSql, parameters);

            if (parameters.SortCriteria == SortCriteria.PriceAsc)
            {
                sqlBuilder.OrderBy($"PrintedEditions.Price ASC OFFSET @Skip ROWS FETCH NEXT @PageSize ROWS ONLY");
            }
            if (parameters.SortCriteria == SortCriteria.PriceDesc)
            {
                sqlBuilder.OrderBy($"PrintedEditions.Price DESC OFFSET @Skip ROWS FETCH NEXT @PageSize ROWS ONLY");
            }
            if (parameters.SortCriteria == SortCriteria.CurrencyAsc)
            {
                sqlBuilder.OrderBy($"PrintedEditions.Currency ASC OFFSET @Skip ROWS FETCH NEXT @PageSize ROWS ONLY");
            }
            if (parameters.SortCriteria == SortCriteria.CurrencyDesc)
            {
                sqlBuilder.OrderBy($"PrintedEditions.Price DESC OFFSET @Skip ROWS FETCH NEXT @PageSize ROWS ONLY");
            }
            if (parameters.SortCriteria == SortCriteria.None)
            {
                sqlBuilder.OrderBy($"PrintedEditions.Id OFFSET @Skip ROWS FETCH NEXT @PageSize ROWS ONLY");
            }


            Dictionary <int, PrintedEditionWithNestedObjects> printedEditionWithNestedObjectsDictionary = new Dictionary <int, PrintedEditionWithNestedObjects>();
            IEnumerable <PrintedEditionWithNestedObjects>     response = await _connection.QueryAsync <PrintedEdition, AuthorInBook, Author, PrintedEditionWithNestedObjects>(itemsExpression.RawSql,
                                                                                                                                                                              (printedEdition, authorInBook, author) =>
            {
                bool isExsist = printedEditionWithNestedObjectsDictionary.TryGetValue(printedEdition.Id, out PrintedEditionWithNestedObjects printedEditionWithNestedObjects);

                if (!isExsist)
                {
                    printedEditionWithNestedObjects = new PrintedEditionWithNestedObjects();
                    printedEditionWithNestedObjects.PrintedEdition = printedEdition;
                    printedEditionWithNestedObjectsDictionary.Add(printedEdition.Id, printedEditionWithNestedObjects);
                }
                if (!(authorInBook is null))
                {
                    authorInBook.Author = author;
                    printedEditionWithNestedObjects.AuthorInBooks.Add(authorInBook);
                }
                return(printedEditionWithNestedObjects);
            },