public async Task <bool> SaveUserActingDetailsAsync(UserActingModel userActingModel)
        {
            if (userActingModel.IsNotNull())
            {
                var userActingDetail = new UserActingDetail
                {
                    UserActing = new UserActing
                    {
                        Id     = userActingModel.Id,
                        UserId = userActingModel.UserId,
                        ActingExperianceCode = userActingModel.ActingExperianceCode,
                        ActingExperiance     = userActingModel.ActingExperiance,
                        AgentNeedCode        = userActingModel.AgentNeedCode,
                        AgentNeed            = string.Empty,
                        Experiance           = userActingModel.Experiance,
                        IsActive             = true,
                        IsDeleted            = false,
                        DttmModified         = DateTime.UtcNow
                    },
                    Accents     = _mapper.Map <List <Accents> >(userActingModel.Accents).Where(x => !string.IsNullOrWhiteSpace(x.SelectedAccent)),
                    Languages   = _mapper.Map <List <Language> >(userActingModel.Languages).Where(x => !string.IsNullOrWhiteSpace(x.SelectedLanguageCode)),
                    ActingRoles = _mapper.Map <List <JobSubGroup> >(userActingModel.AuditionsAndJobsGroup).Where(x => x.SelectedCode != 0)
                };

                return(await _userActingRepository.PerformSaveAndUpdateOperationAsync(userActingDetail));
            }

            return(false);
        }
        public async Task <bool> PerformSaveAndUpdateOperationAsync(UserActingDetail actingDetail)
        {
            try
            {
                using (var conn = await Connection.OpenConnectionAsync())
                {
                    using (var tran = conn.BeginTransaction())
                    {
                        try
                        {
                            conn.Execute(
                                SpNames.UserActing.ClearActingDetail,
                                param: new { actingDetail.UserActing.UserId },
                                transaction: tran,
                                commandType: CommandType.StoredProcedure);


                            /* @UserId UNIQUEIDENTIFIER, @ActingExpCode INT, @AgentNeedCode INT, @Experiance NVARCHAR(2000)*/
                            var param = new DynamicParameters();
                            param.Add("@UserId", actingDetail.UserActing.UserId, DbType.Guid, ParameterDirection.Input);
                            param.Add("@ActingExpCode", actingDetail.UserActing.ActingExperianceCode, DbType.Int32, ParameterDirection.Input);
                            param.Add("@AgentNeedCode", actingDetail.UserActing.AgentNeedCode, DbType.Int32, ParameterDirection.Input);
                            param.Add("@Experiance", actingDetail.UserActing.Experiance, DbType.String, ParameterDirection.Input);
                            var saveUpdate = conn.ExecuteAsync(SpNames.UserActing.SaveUpdate, param: param, transaction: tran, commandType: CommandType.StoredProcedure);

                            var langTask = actingDetail.Languages.Select(async x =>
                            {
                                var langParam = new
                                {
                                    actingDetail.UserActing.UserId,
                                    LanguageCode = x.Code
                                };

                                return(await conn.ExecuteAsync(SpNames.UserActing.UserLanguageSave, param: langParam, transaction: tran, commandType: CommandType.StoredProcedure).ConfigureAwait(false));
                            });
                            var langTaskResult = Task.WhenAll(langTask);


                            var accTask = actingDetail.Accents.Select(async x =>
                            {
                                var accentParam = new
                                {
                                    actingDetail.UserActing.UserId,
                                    AccentCode = x.Code
                                };

                                return(await conn.ExecuteAsync(SpNames.UserActing.UserAccentSave, param: accentParam, transaction: tran, commandType: CommandType.StoredProcedure).ConfigureAwait(false));
                            });
                            var accTaskResult = Task.WhenAll(accTask);


                            var jobGroupTask = actingDetail.ActingRoles.Select(async x =>
                            {
                                var jobGroupParam = new
                                {
                                    actingDetail.UserActing.UserId,
                                    JobCode = x.Code
                                };

                                return(await conn.ExecuteAsync(SpNames.UserActing.UserActingRolesSave, param: jobGroupParam, transaction: tran, commandType: CommandType.StoredProcedure).ConfigureAwait(false));
                            });

                            var jobGroupResult = Task.WhenAll(jobGroupTask);

                            var allTaskResult = Task.WhenAll(saveUpdate, langTaskResult, accTaskResult, jobGroupResult);

                            await allTaskResult.ConfigureAwait(false);

                            if (allTaskResult.IsCompletedSuccessfully)
                            {
                                tran.Commit();
                                return(true);
                            }
                        }
                        catch (Exception ex)
                        {
                            tran.Rollback();
                            throw ex;
                        }

                        return(false);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }