/// <summary>
        /// Updates keywords of given job offer
        /// </summary>
        /// <param name="jobOfferId"></param>
        /// <param name="newKeywords"></param>
        /// <returns></returns>
        public async Task <bool> EditJobOffersKeywordsAsync(Guid jobOfferId, IList <bool> newKeywords)
        {
            using (var uow = UnitOfWorkProvider.Create())
            {
                var filter = new KeywordJobOfferFilterDto {
                    JobOfferId = jobOfferId
                };
                var currentKeywords = await keywordsJobOfferService.ListKeywordsJobOfferAsync(filter);

                foreach (KeywordJobOfferDto keyword in currentKeywords.Items)
                {
                    keywordsJobOfferService.Delete(keyword.Id);
                }

                for (int i = 0; i < newKeywords.Count; i++)
                {
                    if (newKeywords[i])
                    {
                        var keywordDto = new KeywordJobOfferDto {
                            JobOfferId = jobOfferId, Keyword = (Keyword)i
                        };
                        keywordsJobOfferService.Create(keywordDto);
                    }
                }

                await uow.Commit();

                return(true);
            }
        }
        private static SimplePredicate FilterKeywordJobOfferJobOfferId(KeywordJobOfferFilterDto filter)
        {
            if (filter.JobOfferId.Equals(Guid.Empty))
            {
                return(null);
            }

            return(new SimplePredicate(nameof(KeywordsJobOffer.JobOfferId), ValueComparingOperator.Equal, filter.JobOfferId));
        }
        private static CompositePredicate FilterKeywordJobOfferKeywords(KeywordJobOfferFilterDto filter)
        {
            if (filter.KeywordNumbers == null || !filter.KeywordNumbers.Any())
            {
                return(null);
            }

            var keywordsPredicates = new List <IPredicate>(filter.KeywordNumbers
                                                           .Select(keywordNumber => new SimplePredicate(
                                                                       nameof(KeywordsJobOffer.KeywordNumber),
                                                                       ValueComparingOperator.Equal,
                                                                       keywordNumber)));

            return(new CompositePredicate(keywordsPredicates, LogicalOperator.OR));
        }
        protected override IQuery <KeywordsJobOffer> ApplyWhereClause(IQuery <KeywordsJobOffer> query, KeywordJobOfferFilterDto filter)
        {
            var definedPredicates = new List <IPredicate>();

            AddIfDefined(FilterKeywordJobOfferJobOfferId(filter), definedPredicates);
            AddIfDefined(FilterKeywordJobOfferKeywords(filter), definedPredicates);

            if (definedPredicates.Count == 0)
            {
                return(query);
            }

            if (definedPredicates.Count == 1)
            {
                return(query.Where(definedPredicates.First()));
            }

            var wherePredicate = new CompositePredicate(definedPredicates);

            return(query.Where(wherePredicate));
        }