/// <summary>
        /// Updates keywords of given applicant
        /// </summary>
        /// <param name="applicantId"></param>
        /// <param name="newKeywords"></param>
        /// <returns></returns>
        public async Task <bool> EditApplicantsKeywordsAsync(Guid applicantId, IList <bool> newKeywords)
        {
            using (var uow = UnitOfWorkProvider.Create())
            {
                var filter = new KeywordApplicantFilterDto {
                    ApplicantId = applicantId
                };
                var currentKeywords = await keywordsApplicantService.ListKeywordsApplicantAsync(filter);

                foreach (KeywordApplicantDto keyword in currentKeywords.Items)
                {
                    keywordsApplicantService.Delete(keyword.Id);
                }

                for (int i = 0; i < newKeywords.Count; i++)
                {
                    if (newKeywords[i])
                    {
                        var keywordDto = new KeywordApplicantDto {
                            ApplicantId = applicantId, Keyword = (Keyword)i
                        };
                        keywordsApplicantService.Create(keywordDto);
                    }
                }

                await uow.Commit();

                return(true);
            }
        }
        private static SimplePredicate FilterKeywordApplicantApplicantId(KeywordApplicantFilterDto filter)
        {
            if (filter.ApplicantId.Equals(Guid.Empty))
            {
                return(null);
            }

            return(new SimplePredicate(nameof(KeywordsApplicant.ApplicantId), ValueComparingOperator.Equal, filter.ApplicantId));
        }
        private static CompositePredicate FilterKeywordApplicantKeywords(KeywordApplicantFilterDto filter)
        {
            if (filter.KeywordNumbers == null || !filter.KeywordNumbers.Any())
            {
                return(null);
            }

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

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

            AddIfDefined(FilterKeywordApplicantApplicantId(filter), definedPredicates);
            AddIfDefined(FilterKeywordApplicantKeywords(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));
        }