public virtual IEnumerable <ModificationCommandBatch> BatchCommands(IReadOnlyList <IUpdateEntry> entries) { var commands = CreateModificationCommands(entries); var sortedCommandSets = TopologicalSort(commands); // TODO: Enable batching of dependent commands by passing through the dependency graph foreach (var independentCommandSet in sortedCommandSets) { independentCommandSet.Sort(_modificationCommandComparer); var batch = _modificationCommandBatchFactory.Create(); foreach (var modificationCommand in independentCommandSet) { if (!batch.AddCommand(modificationCommand)) { yield return(batch); batch = _modificationCommandBatchFactory.Create(); batch.AddCommand(modificationCommand); } } yield return(batch); } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual IEnumerable <ModificationCommandBatch> BatchCommands(IReadOnlyList <IUpdateEntry> entries) { var parameterNameGenerator = _parameterNameGeneratorFactory.Create(); var commands = CreateModificationCommands(entries, parameterNameGenerator.GenerateNext); var sortedCommandSets = TopologicalSort(commands); // TODO: Enable batching of dependent commands by passing through the dependency graph foreach (var independentCommandSet in sortedCommandSets) { independentCommandSet.Sort(_modificationCommandComparer); var batch = _modificationCommandBatchFactory.Create(); foreach (var modificationCommand in independentCommandSet) { Validate(modificationCommand); if (!batch.AddCommand(modificationCommand)) { if (batch.ModificationCommands.Count == 1 || batch.ModificationCommands.Count >= _minBatchSize) { yield return(batch); } else { foreach (var command in batch.ModificationCommands) { yield return(StartNewBatch(parameterNameGenerator, command)); } } batch = StartNewBatch(parameterNameGenerator, modificationCommand); } } if (batch.ModificationCommands.Count == 1 || batch.ModificationCommands.Count >= _minBatchSize) { yield return(batch); } else { foreach (var command in batch.ModificationCommands) { yield return(StartNewBatch(parameterNameGenerator, command)); } } } }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public virtual IEnumerable <ModificationCommandBatch> BatchCommands(IList <IUpdateEntry> entries) { var parameterNameGenerator = _parameterNameGeneratorFactory.Create(); var commands = CreateModificationCommands(entries, parameterNameGenerator.GenerateNext); var sortedCommandSets = TopologicalSort(commands); // TODO: Enable batching of dependent commands by passing through the dependency graph foreach (var independentCommandSet in sortedCommandSets) { independentCommandSet.Sort(_modificationCommandComparer); var batch = _modificationCommandBatchFactory.Create(); foreach (var modificationCommand in independentCommandSet) { if (!batch.AddCommand(modificationCommand)) { if (batch.ModificationCommands.Count == 1 || batch.ModificationCommands.Count >= _minBatchSize) { if (batch.ModificationCommands.Count > 1) { Dependencies.UpdateLogger.BatchReadyForExecution( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count); } yield return(batch); } else { Dependencies.UpdateLogger.BatchSmallerThanMinBatchSize( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count, _minBatchSize); foreach (var command in batch.ModificationCommands) { yield return(StartNewBatch(parameterNameGenerator, command)); } } batch = StartNewBatch(parameterNameGenerator, modificationCommand); } } if (batch.ModificationCommands.Count == 1 || batch.ModificationCommands.Count >= _minBatchSize) { if (batch.ModificationCommands.Count > 1) { Dependencies.UpdateLogger.BatchReadyForExecution( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count); } yield return(batch); } else { Dependencies.UpdateLogger.BatchSmallerThanMinBatchSize( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count, _minBatchSize); foreach (var command in batch.ModificationCommands) { yield return(StartNewBatch(parameterNameGenerator, command)); } } } }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public virtual IEnumerable <ModificationCommandBatch> BatchCommands( IList <IUpdateEntry> entries, IUpdateAdapter updateAdapter) { var parameterNameGenerator = _parameterNameGeneratorFactory.Create(); var commands = CreateModificationCommands(entries, updateAdapter, parameterNameGenerator.GenerateNext); var sortedCommandSets = TopologicalSort(commands); foreach (var independentCommandSet in sortedCommandSets) { independentCommandSet.Sort(_modificationCommandComparer); var batch = _modificationCommandBatchFactory.Create(); foreach (var modificationCommand in independentCommandSet) { modificationCommand.AssertColumnsNotInitialized(); if (modificationCommand.EntityState == EntityState.Modified && !modificationCommand.ColumnModifications.Any(m => m.IsWrite)) { continue; } if (!batch.AddCommand(modificationCommand)) { if (batch.ModificationCommands.Count == 1 || batch.ModificationCommands.Count >= _minBatchSize) { if (batch.ModificationCommands.Count > 1) { Dependencies.UpdateLogger.BatchReadyForExecution( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count); } yield return(batch); } else { Dependencies.UpdateLogger.BatchSmallerThanMinBatchSize( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count, _minBatchSize); foreach (var command in batch.ModificationCommands) { yield return(StartNewBatch(parameterNameGenerator, command)); } } batch = StartNewBatch(parameterNameGenerator, modificationCommand); } } if (batch.ModificationCommands.Count == 1 || batch.ModificationCommands.Count >= _minBatchSize) { if (batch.ModificationCommands.Count > 1) { Dependencies.UpdateLogger.BatchReadyForExecution( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count); } yield return(batch); } else { Dependencies.UpdateLogger.BatchSmallerThanMinBatchSize( batch.ModificationCommands.SelectMany(c => c.Entries), batch.ModificationCommands.Count, _minBatchSize); foreach (var command in batch.ModificationCommands) { yield return(StartNewBatch(parameterNameGenerator, command)); } } } }