コード例 #1
0
        //TODO merge similarities with batch execution
        private async Task <int> ExecuteChangesAsync(IReadOnlyList <StateEntry> stateEntries,
                                                     CancellationToken cancellationToken = default(CancellationToken))
        {
            var tableGroups = stateEntries.GroupBy(s => s.EntityType);
            var allTasks    = new List <Task <TableResult> >();

            foreach (var tableGroup in tableGroups)
            {
                var table = new AtsTable(tableGroup.Key.TableName());
                var tasks = tableGroup.Select(entry => CreateRequest(table, entry))
                            .TakeWhile(operation => !cancellationToken.IsCancellationRequested)
                            .Select(request => Connection.ExecuteRequestAsync(request, Logger, cancellationToken));
                allTasks.AddRange(tasks);

                if (cancellationToken.IsCancellationRequested)
                {
                    break;
                }
            }
            try
            {
                await Task.WhenAll(allTasks);
            }
            catch (StorageException exception)
            {
                var handled = HandleStorageException(exception, stateEntries);
                if (handled != null)
                {
                    throw handled;
                }
                throw;
            }
            return(allTasks.Count(t => t.Result.HttpStatusCode < (int)HttpStatusCode.BadRequest));
        }
コード例 #2
0
        //TODO merge similarities with batch execution
        private int ExecuteChanges(IReadOnlyList <StateEntry> stateEntries)
        {
            var tableGroups = stateEntries.GroupBy(s => s.EntityType);
            var allResults  = new List <TableResult>();

            try
            {
                foreach (var tableGroup in tableGroups)
                {
                    var table   = new AtsTable(tableGroup.Key.AzureTableStorage().Table);
                    var results = tableGroup.Select(entry => CreateRequest(table, entry))
                                  .Select(request => Connection.ExecuteRequest(request, Logger));
                    allResults.AddRange(results);
                }
            }
            catch (StorageException exception)
            {
                var handled = HandleStorageException(exception, stateEntries);
                if (handled != null)
                {
                    throw handled;
                }
                throw;
            }

            return(allResults.Count(r => r.HttpStatusCode < (int)HttpStatusCode.BadRequest));
        }
コード例 #3
0
        private async Task <int> ExecuteBatchedChangesAsync(IReadOnlyList <StateEntry> stateEntries,
                                                            CancellationToken cancellationToken = default(CancellationToken))
        {
            var tableGroups   = stateEntries.GroupBy(s => s.EntityType.AzureTableStorage().Table);
            var allBatchTasks = new List <Task <IList <TableResult> > >();

            IList <TableResult>[] results;

            try
            {
                foreach (var tableGroup in tableGroups)
                {
                    var table           = new AtsTable(tableGroup.Key);
                    var partitionGroups = tableGroup.GroupBy(s =>
                    {
                        var property = s.EntityType.GetPropertyByColumnName("PartitionKey");
                        return(s[property]);
                    }
                                                             );
                    foreach (var partitionGroup in partitionGroups)
                    {
                        var request = new TableBatchRequest(table);
                        foreach (var operation in partitionGroup
                                 .Select(entry => CreateRequest(table, entry))
                                 .Where(operation => operation != null)
                                 )
                        {
                            request.Add(operation);
                            if (request.Count >= MaxBatchOperations)
                            {
                                allBatchTasks.Add(Connection.ExecuteRequestAsync(request, Logger, cancellationToken));
                                request = new TableBatchRequest(table);
                            }
                        }
                        if (request.Count != 0)
                        {
                            allBatchTasks.Add(Connection.ExecuteRequestAsync(request, Logger, cancellationToken));
                        }
                    }
                }

                results = await Task.WhenAll(allBatchTasks).WithCurrentCulture();
            }
            catch (StorageException exception)
            {
                var handled = HandleStorageException(exception, stateEntries);
                if (handled != null)
                {
                    throw handled;
                }
                throw;
            }
            return(results.Sum(r => r == null ? 0 : r.Count(t => t.HttpStatusCode < (int)HttpStatusCode.BadRequest)));
        }
コード例 #4
0
        private int ExecuteBatchedChanges(IReadOnlyList <StateEntry> stateEntries)
        {
            var tableGroups = stateEntries.GroupBy(s => s.EntityType.AzureTableStorage().Table);
            var results     = new List <IList <TableResult> >();

            try
            {
                foreach (var tableGroup in tableGroups)
                {
                    var table           = new AtsTable(tableGroup.Key);
                    var partitionGroups = tableGroup.GroupBy(s =>
                    {
                        var property = s.EntityType.GetPropertyByColumnName("PartitionKey");
                        return(s[property]);
                    }
                                                             );
                    foreach (var partitionGroup in partitionGroups)
                    {
                        var request = new TableBatchRequest(table);
                        foreach (var operation in partitionGroup
                                 .Select(entry => CreateRequest(table, entry))
                                 .Where(operation => operation != null)
                                 )
                        {
                            request.Add(operation);
                            if (request.Count >= MaxBatchOperations)
                            {
                                results.Add(Connection.ExecuteRequest(request, Logger));
                                request = new TableBatchRequest(table);
                            }
                        }
                        if (request.Count != 0)
                        {
                            results.Add(Connection.ExecuteRequest(request, Logger));
                        }
                    }
                }
            }
            catch (StorageException exception)
            {
                var handled = HandleStorageException(exception, stateEntries);
                if (handled != null)
                {
                    throw handled;
                }
                throw;
            }
            return(results.Sum(r => r == null ? 0 : r.Count(t => t.HttpStatusCode < (int)HttpStatusCode.BadRequest)));
        }
コード例 #5
0
        protected TableOperationRequest CreateRequest(AtsTable table, StateEntry entry)
        {
            var entity = EntityFactory.CreateFromStateEntry(entry);

            switch (entry.EntityState)
            {
            case EntityState.Added:
                return(new CreateRowRequest(table, entity));

            case EntityState.Deleted:
                return(new DeleteRowRequest(table, entity));

            case EntityState.Modified:
                return(new MergeRowRequest(table, entity));

            case EntityState.Unchanged:
            case EntityState.Unknown:
                return(null);

            default:
                throw new ArgumentOutOfRangeException("entry", "Unknown entity state");
            }
        }
コード例 #6
0
ファイル: AtsTable.cs プロジェクト: Elidiomar/ef_core
 protected bool Equals(AtsTable other)
 {
     return(string.Equals(Name, other.Name));
 }
コード例 #7
0
ファイル: AtsTable.cs プロジェクト: Nyaoso/EntityFramework
 protected bool Equals(AtsTable other)
 {
     return string.Equals(Name, other.Name);
 }