Exemplo n.º 1
0
        public async Task BulkUpdatePlayersAsync(IEnumerable <Player> players, CancellationToken cancellationToken)
        {
            var factory    = DbProviderFactories.GetFactory(_settings.DataProviderName);
            var connection = factory.CreateConnection();

            connection.ConnectionString = _settings.DbConnectionString;

            try
            {
                await connection.OpenAsync(cancellationToken);

                var context = new DapperPlusContext
                {
                    Connection = connection
                };
                context.Entity <Player>().Table($"{_settings.ObjectsSchema}.{nameof(Player)}s");

                connection.BulkUpdate(context, players);
            }
            finally
            {
                if (connection.State == ConnectionState.Open)
                {
                    await connection.CloseAsync();
                }
            }
        }
        private async Task RegisterDisciplines(DapperPlusContext dataContext, CancellationToken cancellationToken)
        {
            var disciplines = _disciplines.Select(d => new Discipline {
                Title = d
            });

            dataContext.Entity <Discipline>()
            .Table($"{nameof(Discipline)}s")
            .Identity(x => x.Id);

            await dataContext.BulkActionAsync(x => x.BulkInsert(disciplines), cancellationToken);
        }
        public async Task <OperationResult> GenerateStudentsAndGradesDataLoadAsync(CancellationToken cancellationToken)
        {
            if (_cacheProvider.Get(_studentsGradesCacheKeyName) != null)
            {
                return(OperationResult.Success());
            }

            IDbTransaction    transaction = default;
            DapperPlusContext context;

            using (var conn = new SqlConnection(_connectionString))
            {
                try
                {
                    conn.Open();

                    var dataLoadedAlready = await conn.ExecuteScalarAsync(new CommandDefinition("SELECT 1 FROM dbo.StudentsGrades (NOLOCK)", cancellationToken : cancellationToken));

                    if (dataLoadedAlready != null)
                    {
                        return(OperationResult.Success());
                    }

                    using (transaction = await conn.BeginTransactionAsync(cancellationToken))
                    {
                        context = new DapperPlusContext(transaction.Connection, transaction);

                        await RegisterDisciplines(context, cancellationToken);
                        await GenerateStudentsDataLoadAsync(context, cancellationToken);
                        await GenerateStudentsGradesDataLoadAsync(context, cancellationToken);

                        transaction.Commit();
                    }
                }
                catch (Exception exc)
                {
                    transaction?.Rollback();

                    return(OperationResult.Failure($"Unable to create students and grades data load. {exc.Message}"));
                }
                finally
                {
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                    }

                    context = null;
                }
            }

            return(OperationResult.Success());
        }
        private async Task GenerateStudentsGradesDataLoadAsync(DapperPlusContext dataContext, CancellationToken cancellationToken)
        {
            var sql =
                "INSERT dbo.StudentsGrades (StudentId, DisciplineId, Grade)" +
                "SELECT " +
                "     S.Id StudentId " +
                "    ,D.Id DisciplineId " +
                "    ,dbo.F_RandomValue() Grade " +
                "FROM dbo.Students S " +
                "CROSS JOIN dbo.Disciplines D";

            await dataContext.Connection.ExecuteAsync(sql, transaction : dataContext.Transaction);
        }
        private async Task GenerateStudentsDataLoadAsync(DapperPlusContext dataContext, CancellationToken cancellationToken)
        {
            const int studentCount = 1000;

            var studentsDataFaker = new Faker <Student>()
                                    .RuleFor(u => u.FirstName, f => f.Name.FirstName())
                                    .RuleFor(u => u.LastName, f => f.Name.LastName());

            var students = studentsDataFaker.Generate(studentCount).Distinct(new Student.StudentComparer());

            dataContext.Entity <Student>()
            .Table($"{nameof(Student)}s")
            .Identity(x => x.Id)
            .BatchSize(studentCount);

            await dataContext.BulkActionAsync(x => x.BulkInsert(students), cancellationToken);
        }