public async Task Update(PrintedEditionModel model)
        {
            PrintedEditionWithNestedObjects printedEdition = await _printedEditionRepository.GetWithNestedObjectsByIdAsync(model.Id);

            printedEdition.PrintedEdition = model.MapToEntity(printedEdition.PrintedEdition);

            List <int> authorIdsFromModel  = model.AuthorModels.Select(item => item.Id).ToList();
            List <int> authorIdsFromEntity = printedEdition.AuthorInBooks.Select(item => item.AuthorId).ToList();

            List <AuthorInBook> listToRemove = printedEdition.AuthorInBooks.Where(item => !authorIdsFromModel.Contains(item.AuthorId)).ToList();
            List <AuthorInBook> listToCreate = model.AuthorModels.Where(item => !authorIdsFromEntity.Contains(item.Id)).Select(item => new AuthorInBook {
                PrintedEditionId = printedEdition.PrintedEdition.Id, AuthorId = item.Id
            }).ToList();

            await _printedEditionRepository.UpdateAsync(printedEdition.PrintedEdition);

            if (listToRemove.Any())
            {
                await _authorInBookRepository.RemoveRangeAsync(listToRemove);
            }
            if (listToCreate.Any())
            {
                await _authorInBookRepository.AddRangeAsync(listToCreate);
            }
        }
 internal PrintedEditionModel(PrintedEditionWithNestedObjects printedEdition) : this(printedEdition.PrintedEdition)
 {
     if (!(printedEdition.AuthorInBooks is null))
     {
         AuthorModels = printedEdition.AuthorInBooks.Select(item => new AuthorModel(item.Author)).ToList();
     }
 }
        public async Task <PrintedEditionModel> GetByIdAsync(int id)
        {
            PrintedEditionWithNestedObjects printedEdition = await _printedEditionRepository.GetWithNestedObjectsByIdAsync(id);

            PrintedEditionModel printedEditionModel = new PrintedEditionModel(printedEdition);

            return(printedEditionModel);
        }
示例#4
0
        public async Task <PrintedEditionWithNestedObjects> GetWithNestedObjectsByIdAsync(int id)
        {
            PrintedEditionWithNestedObjects printedEdition = await _dbSet.Where(item => (item.Id == id)).GroupJoin(_context.AuthorInBooks.Include(authorInBook => authorInBook.Author),
                                                                                                                   outerKeySelector => outerKeySelector.Id,
                                                                                                                   innerKeySelector => innerKeySelector.PrintedEditionId,
                                                                                                                   (product, authorInBooks) => new PrintedEditionWithNestedObjects
            {
                PrintedEdition = product,
                AuthorInBooks  = authorInBooks.ToList()
            }).FirstOrDefaultAsync();

            return(printedEdition);
        }
示例#5
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);
            },