From 4a2e4ebc03f07536e400843105b8ed3c9a32a10b Mon Sep 17 00:00:00 2001 From: Arthur Vickers Date: Tue, 14 Dec 2021 10:10:58 +0000 Subject: [PATCH] Static analysis: deconstruction (#26969) --- All.sln.DotSettings | 1 + .../NullableStringDictionaryComparer.cs | 18 +-- .../Internal/StringDictionaryComparer.cs | 16 +-- .../Internal/CosmosModelValidator.cs | 4 +- .../Query/Internal/SelectExpression.cs | 24 ++-- .../Storage/Internal/CosmosClientWrapper.cs | 3 +- .../Storage/Internal/CosmosDatabaseCreator.cs | 4 +- .../Migrations/Design/MigrationsScaffolder.cs | 6 +- .../CSharpRuntimeModelCodeGenerator.cs | 6 +- .../Internal/EntityProjectionExpression.cs | 21 ++-- .../InMemoryQueryExpression.Helper.cs | 4 +- .../Query/Internal/InMemoryQueryExpression.cs | 46 +++---- ...nalCSharpRuntimeAnnotationCodeGenerator.cs | 4 +- .../RelationalModelValidator.cs | 14 +-- .../RelationalRuntimeModelConvention.cs | 26 ++-- .../SequenceUniquificationConvention.cs | 9 +- .../Conventions/SharedTableConvention.cs | 11 +- .../TableSharingConcurrencyTokenConvention.cs | 23 ++-- .../Metadata/Internal/NamedListComparer.cs | 21 ++-- .../Internal/MigrationsModelDiffer.cs | 4 +- .../Migrations/Internal/Migrator.cs | 8 +- .../Query/EntityProjectionExpression.cs | 17 ++- .../Query/Internal/RelationalCommandCache.cs | 5 +- .../SqlExpressions/SelectExpression.Helper.cs | 4 +- .../Query/SqlExpressions/SelectExpression.cs | 112 +++++++++--------- .../Update/Internal/CommandBatchPreparer.cs | 12 +- .../SqlServerMigrationsSqlGenerator.cs | 10 +- .../SqliteMigrationsSqlGenerator.cs | 32 ++--- .../Internal/EntityReferenceMap.cs | 6 +- .../ChangeTracking/Internal/KeyPropagator.cs | 6 +- .../Internal/NavigationFixer.cs | 4 +- .../ChangeTracking/Internal/StateManager.cs | 10 +- src/EFCore/DbContextOptions.cs | 6 +- .../CSharpRuntimeAnnotationCodeGenerator.cs | 66 +++++------ .../Diagnostics/CoreLoggerExtensions.cs | 36 +++--- .../Diagnostics/WarningsConfiguration.cs | 6 +- .../InversePropertyAttributeConvention.cs | 66 +++++------ .../RelationshipDiscoveryConvention.cs | 27 ++--- .../Conventions/RuntimeModelConvention.cs | 70 +++++------ .../Internal/InternalEntityTypeBuilder.cs | 14 +-- .../Internal/InternalForeignKeyBuilder.cs | 22 +--- .../Metadata/Internal/PropertiesSnapshot.cs | 4 +- ...ingExpressionVisitor.ExpressionVisitors.cs | 9 +- ...nExpandingExpressionVisitor.Expressions.cs | 20 ++-- .../NavigationExpandingExpressionVisitor.cs | 6 +- .../ValueConversion/ValueConverterSelector.cs | 7 +- src/Shared/DictionaryExtensions.cs | 6 +- src/Shared/Multigraph.cs | 8 +- 48 files changed, 414 insertions(+), 450 deletions(-) diff --git a/All.sln.DotSettings b/All.sln.DotSettings index 8da6a3a254a..9aeadf36333 100644 --- a/All.sln.DotSettings +++ b/All.sln.DotSettings @@ -279,6 +279,7 @@ The .NET Foundation licenses this file to you under the MIT license. True True True + True True True True diff --git a/src/EFCore.Cosmos/ChangeTracking/Internal/NullableStringDictionaryComparer.cs b/src/EFCore.Cosmos/ChangeTracking/Internal/NullableStringDictionaryComparer.cs index e6ee47166f2..a81fd414687 100644 --- a/src/EFCore.Cosmos/ChangeTracking/Internal/NullableStringDictionaryComparer.cs +++ b/src/EFCore.Cosmos/ChangeTracking/Internal/NullableStringDictionaryComparer.cs @@ -53,14 +53,14 @@ private static bool Compare(TCollection? a, TCollection? b, ValueComparer eleme { var nullableEqualityComparer = new NullableEqualityComparer(elementComparer); var hash = new HashCode(); - foreach (var el in source) + foreach (var (key, element) in source) { - hash.Add(el.Key); - hash.Add(el.Value, nullableEqualityComparer); + hash.Add(key); + hash.Add(element, nullableEqualityComparer); } return hash.ToHashCode(); @@ -100,9 +100,9 @@ private static TCollection Snapshot(TCollection source, ValueComparer } var snapshot = new Dictionary(((IReadOnlyDictionary)source).Count); - foreach (var e in source) + foreach (var (key, element) in source) { - snapshot.Add(e.Key, e.Value is null ? null : elementComparer.Snapshot(e.Value.Value)); + snapshot.Add(key, element is null ? null : elementComparer.Snapshot(element.Value)); } return (TCollection)(object)snapshot; diff --git a/src/EFCore.Cosmos/ChangeTracking/Internal/StringDictionaryComparer.cs b/src/EFCore.Cosmos/ChangeTracking/Internal/StringDictionaryComparer.cs index 06e632c21f8..00e7de11f15 100644 --- a/src/EFCore.Cosmos/ChangeTracking/Internal/StringDictionaryComparer.cs +++ b/src/EFCore.Cosmos/ChangeTracking/Internal/StringDictionaryComparer.cs @@ -52,10 +52,10 @@ private static bool Compare(TCollection? a, TCollection? b, ValueComparer elementComparer) { var hash = new HashCode(); - foreach (var el in source) + foreach (var (key, element) in source) { - hash.Add(el.Key); - hash.Add(el.Value, elementComparer); + hash.Add(key); + hash.Add(element, elementComparer); } return hash.ToHashCode(); @@ -84,9 +84,9 @@ private static TCollection Snapshot(TCollection source, ValueComparer } var snapshot = new Dictionary(((IReadOnlyDictionary)source).Count); - foreach (var e in source) + foreach (var (key, element) in source) { - snapshot.Add(e.Key, e.Value is null ? default! : elementComparer.Snapshot(e.Value)); + snapshot.Add(key, element is null ? default! : elementComparer.Snapshot(element)); } return (TCollection)(object)snapshot; diff --git a/src/EFCore.Cosmos/Infrastructure/Internal/CosmosModelValidator.cs b/src/EFCore.Cosmos/Infrastructure/Internal/CosmosModelValidator.cs index 788f0532b56..beb5daac8b9 100644 --- a/src/EFCore.Cosmos/Infrastructure/Internal/CosmosModelValidator.cs +++ b/src/EFCore.Cosmos/Infrastructure/Internal/CosmosModelValidator.cs @@ -69,10 +69,8 @@ protected virtual void ValidateSharedContainerCompatibility( mappedTypes.Add(entityType); } - foreach (var containerMapping in containers) + foreach (var (container, mappedTypes) in containers) { - var mappedTypes = containerMapping.Value; - var container = containerMapping.Key; ValidateSharedContainerCompatibility(mappedTypes, container, logger); } } diff --git a/src/EFCore.Cosmos/Query/Internal/SelectExpression.cs b/src/EFCore.Cosmos/Query/Internal/SelectExpression.cs index 42463350b13..2fdd67ed532 100644 --- a/src/EFCore.Cosmos/Query/Internal/SelectExpression.cs +++ b/src/EFCore.Cosmos/Query/Internal/SelectExpression.cs @@ -201,12 +201,12 @@ public virtual void ApplyProjection() } var result = new Dictionary(); - foreach (var keyValuePair in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - result[keyValuePair.Key] = Constant( + result[projectionMember] = Constant( AddToProjection( - keyValuePair.Value, - keyValuePair.Key.Last?.Name)); + expression, + projectionMember.Last?.Name)); } _projectionMapping = result; @@ -221,9 +221,9 @@ public virtual void ApplyProjection() public virtual void ReplaceProjectionMapping(IDictionary projectionMapping) { _projectionMapping.Clear(); - foreach (var kvp in projectionMapping) + foreach (var (projectionMember, expression) in projectionMapping) { - _projectionMapping[kvp.Key] = kvp.Value; + _projectionMapping[projectionMember] = expression; } } @@ -458,12 +458,12 @@ protected override Expression VisitChildren(ExpressionVisitor visitor) else { projectionMapping = new Dictionary(); - foreach (var mapping in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - var newProjection = visitor.Visit(mapping.Value); - changed |= newProjection != mapping.Value; + var newProjection = visitor.Visit(expression); + changed |= newProjection != expression; - projectionMapping[mapping.Key] = newProjection; + projectionMapping[projectionMember] = newProjection; } } @@ -519,9 +519,9 @@ public virtual SelectExpression Update( SqlExpression? offset) { var projectionMapping = new Dictionary(); - foreach (var kvp in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - projectionMapping[kvp.Key] = kvp.Value; + projectionMapping[projectionMember] = expression; } return new SelectExpression(projections, fromExpression, orderings, Container) diff --git a/src/EFCore.Cosmos/Storage/Internal/CosmosClientWrapper.cs b/src/EFCore.Cosmos/Storage/Internal/CosmosClientWrapper.cs index 5129ef2ec05..deecf7ffe47 100644 --- a/src/EFCore.Cosmos/Storage/Internal/CosmosClientWrapper.cs +++ b/src/EFCore.Cosmos/Storage/Internal/CosmosClientWrapper.cs @@ -185,8 +185,7 @@ private static async Task CreateContainerIfNotExistsOnceAsync( (ContainerProperties Parameters, CosmosClientWrapper Wrapper) parametersTuple, CancellationToken cancellationToken = default) { - var parameters = parametersTuple.Parameters; - var wrapper = parametersTuple.Wrapper; + var (parameters, wrapper) = parametersTuple; using var response = await wrapper.Client.GetDatabase(wrapper._databaseId).CreateContainerStreamAsync( new Azure.Cosmos.ContainerProperties(parameters.Id, "/" + parameters.PartitionKey) { diff --git a/src/EFCore.Cosmos/Storage/Internal/CosmosDatabaseCreator.cs b/src/EFCore.Cosmos/Storage/Internal/CosmosDatabaseCreator.cs index 9be7c25cda0..c47a412150d 100644 --- a/src/EFCore.Cosmos/Storage/Internal/CosmosDatabaseCreator.cs +++ b/src/EFCore.Cosmos/Storage/Internal/CosmosDatabaseCreator.cs @@ -106,10 +106,8 @@ private static IEnumerable GetContainersToCreate(IModel mod mappedTypes.Add(entityType); } - foreach (var containerMapping in containers) + foreach (var (containerName, mappedTypes) in containers) { - var mappedTypes = containerMapping.Value; - var containerName = containerMapping.Key; string? partitionKey = null; int? analyticalTtl = null; int? defaultTtl = null; diff --git a/src/EFCore.Design/Migrations/Design/MigrationsScaffolder.cs b/src/EFCore.Design/Migrations/Design/MigrationsScaffolder.cs index 891d7cf7055..cead872c3ff 100644 --- a/src/EFCore.Design/Migrations/Design/MigrationsScaffolder.cs +++ b/src/EFCore.Design/Migrations/Design/MigrationsScaffolder.cs @@ -81,7 +81,7 @@ public virtual ScaffoldedMigration ScaffoldMigration( subNamespace = "Migrations"; } - var lastMigration = Dependencies.MigrationsAssembly.Migrations.LastOrDefault(); + var (key, typeInfo) = Dependencies.MigrationsAssembly.Migrations.LastOrDefault(); var migrationNamespace = (!string.IsNullOrEmpty(rootNamespace) @@ -93,7 +93,7 @@ public virtual ScaffoldedMigration ScaffoldMigration( if (subNamespaceDefaulted) { - migrationNamespace = GetNamespace(lastMigration.Value?.AsType(), migrationNamespace!); + migrationNamespace = GetNamespace(typeInfo?.AsType(), migrationNamespace!); } var sanitizedContextName = _contextType.Name; @@ -184,7 +184,7 @@ public virtual ScaffoldedMigration ScaffoldMigration( return new ScaffoldedMigration( codeGenerator.FileExtension, - lastMigration.Key, + key, migrationCode, migrationId, migrationMetadataCode, diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpRuntimeModelCodeGenerator.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpRuntimeModelCodeGenerator.cs index f43786737d7..bee5c1ade02 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpRuntimeModelCodeGenerator.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpRuntimeModelCodeGenerator.cs @@ -68,12 +68,12 @@ public virtual IReadOnlyCollection GenerateModel( var modelBuilderFileName = options.ContextType.ShortDisplayName() + ModelBuilderSuffix + FileExtension; scaffoldedFiles.Add(new ScaffoldedFile { Path = modelBuilderFileName, Code = modelBuilderCode }); - foreach (var (entityType, namePair) in entityTypeIds) + foreach (var (entityType, (_, @class)) in entityTypeIds) { var generatedCode = GenerateEntityType( - entityType, options.ModelNamespace, namePair.Class, options.UseNullableReferenceTypes); + entityType, options.ModelNamespace, @class, options.UseNullableReferenceTypes); - var entityTypeFileName = namePair.Class + FileExtension; + var entityTypeFileName = @class + FileExtension; scaffoldedFiles.Add(new ScaffoldedFile { Path = entityTypeFileName, Code = generatedCode }); } diff --git a/src/EFCore.InMemory/Query/Internal/EntityProjectionExpression.cs b/src/EFCore.InMemory/Query/Internal/EntityProjectionExpression.cs index 55b301c6aca..c2d461e8d43 100644 --- a/src/EFCore.InMemory/Query/Internal/EntityProjectionExpression.cs +++ b/src/EFCore.InMemory/Query/Internal/EntityProjectionExpression.cs @@ -72,13 +72,12 @@ public virtual EntityProjectionExpression UpdateEntityType(IEntityType derivedTy } var readExpressionMap = new Dictionary(); - foreach (var kvp in _readExpressionMap) + foreach (var (property, methodCallExpression) in _readExpressionMap) { - var property = kvp.Key; if (derivedType.IsAssignableFrom(property.DeclaringEntityType) || property.DeclaringEntityType.IsAssignableFrom(derivedType)) { - readExpressionMap[property] = kvp.Value; + readExpressionMap[property] = methodCallExpression; } } @@ -151,12 +150,12 @@ public virtual EntityProjectionExpression Clone() { var readExpressionMap = new Dictionary(_readExpressionMap); var entityProjectionExpression = new EntityProjectionExpression(EntityType, readExpressionMap); - foreach (var kvp in _navigationExpressionsCache) + foreach (var (navigation, entityShaperExpression) in _navigationExpressionsCache) { - entityProjectionExpression._navigationExpressionsCache[kvp.Key] = new EntityShaperExpression( - kvp.Value.EntityType, - ((EntityProjectionExpression)kvp.Value.ValueBufferExpression).Clone(), - kvp.Value.IsNullable); + entityProjectionExpression._navigationExpressionsCache[navigation] = new EntityShaperExpression( + entityShaperExpression.EntityType, + ((EntityProjectionExpression)entityShaperExpression.ValueBufferExpression).Clone(), + entityShaperExpression.IsNullable); } return entityProjectionExpression; @@ -173,10 +172,10 @@ void IPrintableExpression.Print(ExpressionPrinter expressionPrinter) expressionPrinter.AppendLine(nameof(EntityProjectionExpression) + ":"); using (expressionPrinter.Indent()) { - foreach (var readExpressionMapEntry in _readExpressionMap) + foreach (var (property, methodCallExpression) in _readExpressionMap) { - expressionPrinter.Append(readExpressionMapEntry.Key + " -> "); - expressionPrinter.Visit(readExpressionMapEntry.Value); + expressionPrinter.Append(property + " -> "); + expressionPrinter.Visit(methodCallExpression); expressionPrinter.AppendLine(); } } diff --git a/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.Helper.cs b/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.Helper.cs index 2cef99faf21..97fcc3bd115 100644 --- a/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.Helper.cs +++ b/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.Helper.cs @@ -211,9 +211,9 @@ private sealed class CloningExpressionVisitor : ExpressionVisitor inMemoryQueryExpression._clientProjections.Select(e => Visit(e))); clonedInMemoryQueryExpression._projectionMappingExpressions.AddRange( inMemoryQueryExpression._projectionMappingExpressions); - foreach (var item in inMemoryQueryExpression._projectionMapping) + foreach (var (projectionMember, value) in inMemoryQueryExpression._projectionMapping) { - clonedInMemoryQueryExpression._projectionMapping[item.Key] = Visit(item.Value); + clonedInMemoryQueryExpression._projectionMapping[projectionMember] = Visit(value); } return clonedInMemoryQueryExpression; diff --git a/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.cs b/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.cs index 1578ac14677..47efb59d618 100644 --- a/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.cs +++ b/src/EFCore.InMemory/Query/Internal/InMemoryQueryExpression.cs @@ -160,18 +160,18 @@ public virtual void ReplaceProjection(IReadOnlyDictionary(); - foreach (var keyValuePair in projectionMapping) + foreach (var (projectionMember, expression) in projectionMapping) { - if (keyValuePair.Value is EntityProjectionExpression entityProjectionExpression) + if (expression is EntityProjectionExpression entityProjectionExpression) { - _projectionMapping[keyValuePair.Key] = AddEntityProjection(entityProjectionExpression); + _projectionMapping[projectionMember] = AddEntityProjection(entityProjectionExpression); } else { - selectorExpressions.Add(keyValuePair.Value); + selectorExpressions.Add(expression); var readExpression = CreateReadValueExpression( - keyValuePair.Value.Type, selectorExpressions.Count - 1, InferPropertyFromInner(keyValuePair.Value)); - _projectionMapping[keyValuePair.Key] = readExpression; + expression.Type, selectorExpressions.Count - 1, InferPropertyFromInner(expression)); + _projectionMapping[projectionMember] = readExpression; _projectionMappingExpressions.Add(readExpression); } } @@ -302,9 +302,9 @@ public virtual void ApplyProjection() else { var newProjectionMapping = new Dictionary(); - foreach (var keyValuePair in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - if (keyValuePair.Value is EntityProjectionExpression entityProjectionExpression) + if (expression is EntityProjectionExpression entityProjectionExpression) { var indexMap = new Dictionary(); foreach (var property in GetAllPropertiesInHierarchy(entityProjectionExpression.EntityType)) @@ -313,12 +313,12 @@ public virtual void ApplyProjection() indexMap[property] = selectorExpressions.Count - 1; } - newProjectionMapping[keyValuePair.Key] = Constant(indexMap); + newProjectionMapping[projectionMember] = Constant(indexMap); } else { - selectorExpressions.Add(keyValuePair.Value); - newProjectionMapping[keyValuePair.Key] = Constant(selectorExpressions.Count - 1); + selectorExpressions.Add(expression); + newProjectionMapping[projectionMember] = Constant(selectorExpressions.Count - 1); } } @@ -465,11 +465,11 @@ public virtual void ApplyDefaultIfEmpty() } var projectionMapping = new Dictionary(); - foreach (var keyValuePair in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - projectionMapping[keyValuePair.Key] = keyValuePair.Value is EntityProjectionExpression entityProjectionExpression + projectionMapping[projectionMember] = expression is EntityProjectionExpression entityProjectionExpression ? MakeEntityProjectionNullable(entityProjectionExpression) - : MakeReadValueNullable(keyValuePair.Value); + : MakeReadValueNullable(expression); } _projectionMapping = projectionMapping; @@ -816,10 +816,10 @@ void IPrintableExpression.Print(ExpressionPrinter expressionPrinter) expressionPrinter.AppendLine("ProjectionMapping:"); using (expressionPrinter.Indent()) { - foreach (var projectionMapping in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - expressionPrinter.Append("Member: " + projectionMapping.Key + " Projection: "); - expressionPrinter.Visit(projectionMapping.Value); + expressionPrinter.Append("Member: " + projectionMember + " Projection: "); + expressionPrinter.Visit(expression); expressionPrinter.AppendLine(","); } } @@ -961,20 +961,20 @@ private Expression AddJoin( { var projectionMapping = new Dictionary(); var mapping = new Dictionary(); - foreach (var projection in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - var newProjectionMember = projection.Key.Prepend(outerMemberInfo); - mapping[projection.Key] = newProjectionMember; - if (projection.Value is EntityProjectionExpression entityProjectionExpression) + var newProjectionMember = projectionMember.Prepend(outerMemberInfo); + mapping[projectionMember] = newProjectionMember; + if (expression is EntityProjectionExpression entityProjectionExpression) { projectionMapping[newProjectionMember] = TraverseEntityProjection( resultSelectorExpressions, entityProjectionExpression, makeNullable: false); } else { - resultSelectorExpressions.Add(projection.Value); + resultSelectorExpressions.Add(expression); projectionMapping[newProjectionMember] = CreateReadValueExpression( - projection.Value.Type, resultSelectorExpressions.Count - 1, InferPropertyFromInner(projection.Value)); + expression.Type, resultSelectorExpressions.Count - 1, InferPropertyFromInner(expression)); } } diff --git a/src/EFCore.Relational/Design/Internal/RelationalCSharpRuntimeAnnotationCodeGenerator.cs b/src/EFCore.Relational/Design/Internal/RelationalCSharpRuntimeAnnotationCodeGenerator.cs index f62982e80b5..26e55fb3a33 100644 --- a/src/EFCore.Relational/Design/Internal/RelationalCSharpRuntimeAnnotationCodeGenerator.cs +++ b/src/EFCore.Relational/Design/Internal/RelationalCSharpRuntimeAnnotationCodeGenerator.cs @@ -365,9 +365,9 @@ public override void Generate(IProperty property, CSharpRuntimeAnnotationCodeGen parameters.MainBuilder .Append("var ").Append(overridesVariable).AppendLine(" = new SortedDictionary();"); - foreach (var overridePair in overrides) + foreach (var (key, value) in overrides) { - Create((IRelationalPropertyOverrides)overridePair.Value, overridePair.Key, overridesVariable, parameters); + Create((IRelationalPropertyOverrides)value, key, overridesVariable, parameters); } GenerateSimpleAnnotation(RelationalAnnotationNames.RelationalOverrides, overridesVariable, parameters); diff --git a/src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs b/src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs index 35007ce1869..59c452f597d 100644 --- a/src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs +++ b/src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs @@ -283,10 +283,8 @@ protected virtual void ValidateSharedTableCompatibility( mappedTypes.Add(entityType); } - foreach (var tableMapping in tables) + foreach (var (table, mappedTypes) in tables) { - var mappedTypes = tableMapping.Value; - var table = tableMapping.Key; ValidateSharedTableCompatibility(mappedTypes, table.Name, table.Schema, logger); ValidateSharedColumnsCompatibility(mappedTypes, table, logger); ValidateSharedKeysCompatibility(mappedTypes, table, logger); @@ -558,10 +556,8 @@ protected virtual void ValidateSharedViewCompatibility( mappedTypes.Add(entityType); } - foreach (var tableMapping in views) + foreach (var (table, mappedTypes) in views) { - var mappedTypes = tableMapping.Value; - var table = tableMapping.Key; ValidateSharedViewCompatibility(mappedTypes, table.Name, table.Schema, logger); ValidateSharedColumnsCompatibility(mappedTypes, table, logger); } @@ -702,11 +698,11 @@ protected virtual void ValidateSharedColumnsCompatibility( if (missingConcurrencyTokens != null) { missingConcurrencyTokens.Clear(); - foreach (var tokenPair in concurrencyColumns!) + foreach (var (key, readOnlyProperties) in concurrencyColumns!) { - if (TableSharingConcurrencyTokenConvention.IsConcurrencyTokenMissing(tokenPair.Value, entityType, mappedTypes)) + if (TableSharingConcurrencyTokenConvention.IsConcurrencyTokenMissing(readOnlyProperties, entityType, mappedTypes)) { - missingConcurrencyTokens.Add(tokenPair.Key); + missingConcurrencyTokens.Add(key); } } } diff --git a/src/EFCore.Relational/Metadata/Conventions/RelationalRuntimeModelConvention.cs b/src/EFCore.Relational/Metadata/Conventions/RelationalRuntimeModelConvention.cs index 530650d29f1..06f382ebf18 100644 --- a/src/EFCore.Relational/Metadata/Conventions/RelationalRuntimeModelConvention.cs +++ b/src/EFCore.Relational/Metadata/Conventions/RelationalRuntimeModelConvention.cs @@ -61,12 +61,12 @@ protected override void ProcessModelAnnotations( if (annotations.TryGetValue(RelationalAnnotationNames.DbFunctions, out var functions)) { var runtimeFunctions = new SortedDictionary(StringComparer.Ordinal); - foreach (var functionPair in (SortedDictionary)functions!) + foreach (var (key, dbFunction) in (SortedDictionary)functions!) { - var runtimeFunction = Create(functionPair.Value, runtimeModel); - runtimeFunctions[functionPair.Key] = runtimeFunction; + var runtimeFunction = Create(dbFunction, runtimeModel); + runtimeFunctions[key] = runtimeFunction; - foreach (var parameter in functionPair.Value.Parameters) + foreach (var parameter in dbFunction.Parameters) { var runtimeParameter = Create(parameter, runtimeFunction); @@ -76,7 +76,7 @@ protected override void ProcessModelAnnotations( } CreateAnnotations( - functionPair.Value, runtimeFunction, static (convention, annotations, source, target, runtime) => + dbFunction, runtimeFunction, static (convention, annotations, source, target, runtime) => convention.ProcessFunctionAnnotations(annotations, source, target, runtime)); } @@ -86,13 +86,13 @@ protected override void ProcessModelAnnotations( if (annotations.TryGetValue(RelationalAnnotationNames.Sequences, out var sequences)) { var runtimeSequences = new SortedDictionary<(string, string?), ISequence>(); - foreach (var sequencePair in (SortedDictionary<(string, string?), ISequence>)sequences!) + foreach (var (key, value) in (SortedDictionary<(string, string?), ISequence>)sequences!) { - var runtimeSequence = Create(sequencePair.Value, runtimeModel); - runtimeSequences[sequencePair.Key] = runtimeSequence; + var runtimeSequence = Create(value, runtimeModel); + runtimeSequences[key] = runtimeSequence; CreateAnnotations( - sequencePair.Value, runtimeSequence, static (convention, annotations, source, target, runtime) => + value, runtimeSequence, static (convention, annotations, source, target, runtime) => convention.ProcessSequenceAnnotations(annotations, source, target, runtime)); } @@ -269,13 +269,13 @@ protected override void ProcessPropertyAnnotations( if (annotations.TryGetValue(RelationalAnnotationNames.RelationalOverrides, out var overrides)) { var runtimePropertyOverrides = new SortedDictionary(); - foreach (var overridesPair in (SortedDictionary?)overrides!) + foreach (var (storeObjectIdentifier, value) in (SortedDictionary?)overrides!) { - var runtimeOverrides = Create((IRelationalPropertyOverrides)overridesPair.Value, runtimeProperty); - runtimePropertyOverrides[overridesPair.Key] = runtimeOverrides; + var runtimeOverrides = Create((IRelationalPropertyOverrides)value, runtimeProperty); + runtimePropertyOverrides[storeObjectIdentifier] = runtimeOverrides; CreateAnnotations( - (IRelationalPropertyOverrides)overridesPair.Value, runtimeOverrides, + (IRelationalPropertyOverrides)value, runtimeOverrides, static (convention, annotations, source, target, runtime) => convention.ProcessPropertyOverridesAnnotations(annotations, source, target, runtime)); } diff --git a/src/EFCore.Relational/Metadata/Conventions/SequenceUniquificationConvention.cs b/src/EFCore.Relational/Metadata/Conventions/SequenceUniquificationConvention.cs index 331e975a4dc..cd76351ef7f 100644 --- a/src/EFCore.Relational/Metadata/Conventions/SequenceUniquificationConvention.cs +++ b/src/EFCore.Relational/Metadata/Conventions/SequenceUniquificationConvention.cs @@ -53,13 +53,12 @@ public virtual void ProcessModelFinalizing( var toReplace = modelSequences .Where(s => s.Key.Name.Length > maxLength).ToList(); - foreach (var sequence in toReplace) + foreach (var ((name, schema), sequence) in toReplace) { - var schemaName = sequence.Key.Schema; var newSequenceName = Uniquifier.Uniquify( - sequence.Key.Name, modelSequences, - sequenceName => (sequenceName, schemaName), maxLength); - Sequence.SetName((IMutableModel)model, (Sequence)sequence.Value, newSequenceName); + name, modelSequences, + sequenceName => (sequenceName, schema), maxLength); + Sequence.SetName((IMutableModel)model, (Sequence)sequence, newSequenceName); } } } diff --git a/src/EFCore.Relational/Metadata/Conventions/SharedTableConvention.cs b/src/EFCore.Relational/Metadata/Conventions/SharedTableConvention.cs index 33514e01999..cbcb433d86c 100644 --- a/src/EFCore.Relational/Metadata/Conventions/SharedTableConvention.cs +++ b/src/EFCore.Relational/Metadata/Conventions/SharedTableConvention.cs @@ -51,7 +51,7 @@ public virtual void ProcessModelFinalizing( var foreignKeys = new Dictionary(); var indexes = new Dictionary(); var checkConstraints = new Dictionary<(string, string?), IConventionCheckConstraint>(); - foreach (var table in tables) + foreach (var ((tableName, schema), conventionEntityTypes) in tables) { columns.Clear(); keys.Clear(); @@ -67,8 +67,8 @@ public virtual void ProcessModelFinalizing( checkConstraints.Clear(); } - var storeObject = StoreObjectIdentifier.Table(table.Key.TableName, table.Key.Schema); - foreach (var entityType in table.Value) + var storeObject = StoreObjectIdentifier.Table(tableName, schema); + foreach (var entityType in conventionEntityTypes) { TryUniquifyColumnNames(entityType, columns, storeObject, maxLength); TryUniquifyKeyNames(entityType, keys, storeObject, maxLength); @@ -162,11 +162,10 @@ private static void TryUniquifyTableNames( // Some entity types might end up mapped to the same table after the table name is truncated, // so we need to map them to different tables as was intended initially - foreach (var subTables in clashingTables) + foreach (var (table, value) in clashingTables) { - var table = subTables.Key; var oldTable = tables[table]; - foreach (var subTable in subTables.Value.Values.Skip(1)) + foreach (var subTable in value.Values.Skip(1)) { var uniqueName = Uniquifier.Uniquify(table.Name, tables, n => (n, table.Schema), maxLength); tables[(uniqueName, table.Schema)] = subTable; diff --git a/src/EFCore.Relational/Metadata/Conventions/TableSharingConcurrencyTokenConvention.cs b/src/EFCore.Relational/Metadata/Conventions/TableSharingConcurrencyTokenConvention.cs index e01d6df504d..99b7f6f44b0 100644 --- a/src/EFCore.Relational/Metadata/Conventions/TableSharingConcurrencyTokenConvention.cs +++ b/src/EFCore.Relational/Metadata/Conventions/TableSharingConcurrencyTokenConvention.cs @@ -64,28 +64,22 @@ public virtual void ProcessModelFinalizing( mappedTypes.Add(entityType); } - foreach (var tableToEntityType in tableToEntityTypes) + foreach (var ((name, schema), mappedTypes) in tableToEntityTypes) { - var table = tableToEntityType.Key; - var mappedTypes = tableToEntityType.Value; - - var concurrencyColumns = GetConcurrencyTokensMap(StoreObjectIdentifier.Table(table.Name, table.Schema), mappedTypes); + var concurrencyColumns = GetConcurrencyTokensMap(StoreObjectIdentifier.Table(name, schema), mappedTypes); if (concurrencyColumns == null) { continue; } - foreach (var concurrencyColumn in concurrencyColumns) + foreach (var (concurrencyColumnName, readOnlyProperties) in concurrencyColumns) { - var concurrencyColumnName = concurrencyColumn.Key; - var propertiesMappedToConcurrencyColumn = concurrencyColumn.Value; - Dictionary? entityTypesMissingConcurrencyColumn = null; foreach (var entityType in mappedTypes) { - var foundMappedProperty = !IsConcurrencyTokenMissing(propertiesMappedToConcurrencyColumn, entityType, mappedTypes) + var foundMappedProperty = !IsConcurrencyTokenMissing(readOnlyProperties, entityType, mappedTypes) || entityType.GetProperties() - .Any(p => p.GetColumnName(StoreObjectIdentifier.Table(table.Name, table.Schema)) == concurrencyColumnName); + .Any(p => p.GetColumnName(StoreObjectIdentifier.Table(name, schema)) == concurrencyColumnName); if (!foundMappedProperty) { @@ -96,7 +90,7 @@ public virtual void ProcessModelFinalizing( // property which _is_ mapped to this concurrency token // column and which will be used later as a template entityTypesMissingConcurrencyColumn.Add( - entityType, propertiesMappedToConcurrencyColumn.First()); + entityType, readOnlyProperties.First()); } } @@ -107,10 +101,9 @@ public virtual void ProcessModelFinalizing( RemoveDerivedEntityTypes(entityTypesMissingConcurrencyColumn); - foreach (var entityTypeToExampleProperty in entityTypesMissingConcurrencyColumn) + foreach (var (conventionEntityType, exampleProperty) in entityTypesMissingConcurrencyColumn) { - var exampleProperty = entityTypeToExampleProperty.Value; - entityTypeToExampleProperty.Key.Builder.CreateUniqueProperty( + conventionEntityType.Builder.CreateUniqueProperty( exampleProperty.ClrType, ConcurrencyPropertyPrefix + exampleProperty.Name, !exampleProperty.IsNullable)! diff --git a/src/EFCore.Relational/Metadata/Internal/NamedListComparer.cs b/src/EFCore.Relational/Metadata/Internal/NamedListComparer.cs index 5a995b1ff4d..5347b841344 100644 --- a/src/EFCore.Relational/Metadata/Internal/NamedListComparer.cs +++ b/src/EFCore.Relational/Metadata/Internal/NamedListComparer.cs @@ -33,19 +33,21 @@ private NamedListComparer() /// public int Compare((string, string?, IReadOnlyList) x, (string, string?, IReadOnlyList) y) { - var result = StringComparer.Ordinal.Compare(x.Item1, y.Item1); + var (x1, x2, xList) = x; + var (y1, y2, yList) = y; + var result = StringComparer.Ordinal.Compare(x1, y1); if (result != 0) { return result; } - result = StringComparer.Ordinal.Compare(x.Item2, y.Item2); + result = StringComparer.Ordinal.Compare(x2, y2); if (result != 0) { return result; } - result = x.Item3.Count - y.Item3.Count; + result = xList.Count - yList.Count; if (result != 0) { return result; @@ -53,9 +55,9 @@ public int Compare((string, string?, IReadOnlyList) x, (string, string?, var index = 0; while ((result == 0) - && (index < x.Item3.Count)) + && (index < xList.Count)) { - result = StringComparer.Ordinal.Compare(x.Item3[index], y.Item3[index]); + result = StringComparer.Ordinal.Compare(xList[index], yList[index]); index++; } @@ -80,11 +82,12 @@ public bool Equals((string, string?, IReadOnlyList) x, (string, string?, public int GetHashCode((string, string?, IReadOnlyList) obj) { var hash = new HashCode(); - hash.Add(obj.Item1); - hash.Add(obj.Item2); - for (var i = 0; i < obj.Item3.Count; i++) + var (item1, item2, list) = obj; + hash.Add(item1); + hash.Add(item2); + for (var i = 0; i < list.Count; i++) { - hash.Add(obj.Item3[i]); + hash.Add(list[i]); } return hash.ToHashCode(); diff --git a/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs b/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs index c4a93324c79..2d37578ee26 100644 --- a/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs +++ b/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs @@ -774,9 +774,9 @@ private static IEnumerable GetSortedProperties(IEntityType entityType types.GetOrAddNew(clrType)[index] = clrProperty; } - foreach (var group in unorderedGroups) + foreach (var (propertyInfo, properties) in unorderedGroups) { - groups.Add(group.Key, group.Value.Values.ToList()); + groups.Add(propertyInfo, properties.Values.ToList()); } if (table.EntityTypeMappings.Any(m => m.EntityType == entityType)) diff --git a/src/EFCore.Relational/Migrations/Internal/Migrator.cs b/src/EFCore.Relational/Migrations/Internal/Migrator.cs index d52b2790f29..d77eeeb5bc7 100644 --- a/src/EFCore.Relational/Migrations/Internal/Migrator.cs +++ b/src/EFCore.Relational/Migrations/Internal/Migrator.cs @@ -206,15 +206,15 @@ protected virtual void PopulateMigrations( _logger.MigrationsNotFound(this, _migrationsAssembly); } - foreach (var migration in _migrationsAssembly.Migrations) + foreach (var (key, typeInfo) in _migrationsAssembly.Migrations) { - if (appliedMigrationEntrySet.Contains(migration.Key)) + if (appliedMigrationEntrySet.Contains(key)) { - appliedMigrations.Add(migration.Key, migration.Value); + appliedMigrations.Add(key, typeInfo); } else { - unappliedMigrations.Add(migration.Key, migration.Value); + unappliedMigrations.Add(key, typeInfo); } } diff --git a/src/EFCore.Relational/Query/EntityProjectionExpression.cs b/src/EFCore.Relational/Query/EntityProjectionExpression.cs index aef376e7fd6..cebfec285cb 100644 --- a/src/EFCore.Relational/Query/EntityProjectionExpression.cs +++ b/src/EFCore.Relational/Query/EntityProjectionExpression.cs @@ -59,12 +59,12 @@ protected override Expression VisitChildren(ExpressionVisitor visitor) { var changed = false; var propertyExpressionMap = new Dictionary(); - foreach (var expression in _propertyExpressionMap) + foreach (var (property, columnExpression) in _propertyExpressionMap) { - var newExpression = (ColumnExpression)visitor.Visit(expression.Value); - changed |= newExpression != expression.Value; + var newExpression = (ColumnExpression)visitor.Visit(columnExpression); + changed |= newExpression != columnExpression; - propertyExpressionMap[expression.Key] = newExpression; + propertyExpressionMap[property] = newExpression; } var discriminatorExpression = (SqlExpression?)visitor.Visit(DiscriminatorExpression); @@ -82,9 +82,9 @@ protected override Expression VisitChildren(ExpressionVisitor visitor) public virtual EntityProjectionExpression MakeNullable() { var propertyExpressionMap = new Dictionary(); - foreach (var expression in _propertyExpressionMap) + foreach (var (property, columnExpression) in _propertyExpressionMap) { - propertyExpressionMap[expression.Key] = expression.Value.MakeNullable(); + propertyExpressionMap[property] = columnExpression.MakeNullable(); } // We don't need to process DiscriminatorExpression because they are already nullable @@ -106,13 +106,12 @@ public virtual EntityProjectionExpression UpdateEntityType(IEntityType derivedTy } var propertyExpressionMap = new Dictionary(); - foreach (var kvp in _propertyExpressionMap) + foreach (var (property, columnExpression) in _propertyExpressionMap) { - var property = kvp.Key; if (derivedType.IsAssignableFrom(property.DeclaringEntityType) || property.DeclaringEntityType.IsAssignableFrom(derivedType)) { - propertyExpressionMap[property] = kvp.Value; + propertyExpressionMap[property] = columnExpression; } } diff --git a/src/EFCore.Relational/Query/Internal/RelationalCommandCache.cs b/src/EFCore.Relational/Query/Internal/RelationalCommandCache.cs index 4bc05256546..c7d5fa7d2e7 100644 --- a/src/EFCore.Relational/Query/Internal/RelationalCommandCache.cs +++ b/src/EFCore.Relational/Query/Internal/RelationalCommandCache.cs @@ -138,10 +138,9 @@ public bool Equals(CommandCacheKey commandCacheKey) if (_parameterValues.Count > 0) { - foreach (var parameterValue in _parameterValues) + foreach (var (key, value) in _parameterValues) { - var value = parameterValue.Value; - if (!commandCacheKey._parameterValues.TryGetValue(parameterValue.Key, out var otherValue)) + if (!commandCacheKey._parameterValues.TryGetValue(key, out var otherValue)) { return false; } diff --git a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs index 455d75fe974..dde4e8ad491 100644 --- a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs +++ b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs @@ -734,9 +734,9 @@ private sealed class CloningExpressionVisitor : ExpressionVisitor if (expression is SelectExpression selectExpression) { var newProjectionMappings = new Dictionary(selectExpression._projectionMapping.Count); - foreach (var keyValuePair in selectExpression._projectionMapping) + foreach (var (projectionMember, value) in selectExpression._projectionMapping) { - newProjectionMappings[keyValuePair.Key] = Visit(keyValuePair.Value); + newProjectionMappings[projectionMember] = Visit(value); } var newProjections = selectExpression._projection.Select(Visit).ToList(); diff --git a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs index 8a970a7548d..c6f59587e63 100644 --- a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs +++ b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs @@ -823,9 +823,9 @@ static Expression RemoveConvert(Expression expression) { var updatedExpressions = new List(); var comparers = new List(); - foreach (var keyExpression in identifyingProjection) + foreach (var (column, comparer) in identifyingProjection) { - var index = selectExpression.AddToProjection(keyExpression.Column, null); + var index = selectExpression.AddToProjection(column, null); var clientProjectionToAdd = Constant(index); var existingIndex = clientProjectionList.FindIndex( e => ExpressionEqualityComparer.Instance.Equals(e, clientProjectionToAdd)); @@ -836,13 +836,13 @@ static Expression RemoveConvert(Expression expression) } var projectionBindingExpression = new ProjectionBindingExpression( - selectExpression, existingIndex, keyExpression.Column.Type.MakeNullable()); + selectExpression, existingIndex, column.Type.MakeNullable()); updatedExpressions.Add( projectionBindingExpression.Type.IsValueType ? Convert(projectionBindingExpression, typeof(object)) : projectionBindingExpression); - comparers.Add(keyExpression.Comparer); + comparers.Add(comparer); } return (NewArrayInit(typeof(object), updatedExpressions), comparers); @@ -933,9 +933,9 @@ Expression CopyProjectionToOuter(SelectExpression innerSelectExpression, Express if (constantValue is Dictionary entityDictionary) { var newDictionary = new Dictionary(entityDictionary.Count); - foreach (var kvp in entityDictionary) + foreach (var (property, value) in entityDictionary) { - newDictionary[kvp.Key] = projectionIndexMap[kvp.Value]; + newDictionary[property] = projectionIndexMap[value]; } remappedConstant = Constant(newDictionary); @@ -961,11 +961,11 @@ Expression CopyProjectionToOuter(SelectExpression innerSelectExpression, Express { var result = new Dictionary(_projectionMapping.Count); - foreach (var keyValuePair in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - result[keyValuePair.Key] = keyValuePair.Value is EntityProjectionExpression entityProjection + result[projectionMember] = expression is EntityProjectionExpression entityProjection ? AddEntityProjection(entityProjection) - : Constant(AddToProjection((SqlExpression)keyValuePair.Value, keyValuePair.Key.Last?.Name)); + : Constant(AddToProjection((SqlExpression)expression, projectionMember.Last?.Name)); } _projectionMapping.Clear(); @@ -998,14 +998,13 @@ ConstantExpression AddEntityProjection(EntityProjectionExpression entityProjecti public void ReplaceProjection(IReadOnlyDictionary projectionMapping) { _projectionMapping.Clear(); - foreach (var kvp in projectionMapping) + foreach (var (projectionMember, expression) in projectionMapping) { - var expression = kvp.Value; Check.DebugAssert( expression is SqlExpression || expression is EntityProjectionExpression, "Invalid operation in the projection."); - _projectionMapping[kvp.Key] = expression; + _projectionMapping[projectionMember] = expression; } } @@ -1502,21 +1501,21 @@ private void ApplySetOperation(SetOperationType setOperationType, SelectExpressi var tableReferenceExpression = new TableReferenceExpression(this, setOperationAlias); var aliasUniquifier = new AliasUniquifier(_usedAliases); - foreach (var joinedMapping in select1._projectionMapping.Join( + foreach (var (projectionMember, expression1, expression2) in select1._projectionMapping.Join( select2._projectionMapping, kv => kv.Key, kv => kv.Key, (kv1, kv2) => (kv1.Key, Value1: kv1.Value, Value2: kv2.Value))) { - if (joinedMapping.Value1 is EntityProjectionExpression entityProjection1 - && joinedMapping.Value2 is EntityProjectionExpression entityProjection2) + if (expression1 is EntityProjectionExpression entityProjection1 + && expression2 is EntityProjectionExpression entityProjection2) { - HandleEntityProjection(joinedMapping.Key, select1, entityProjection1, select2, entityProjection2); + HandleEntityProjection(projectionMember, select1, entityProjection1, select2, entityProjection2); continue; } - var innerColumn1 = (SqlExpression)joinedMapping.Value1; - var innerColumn2 = (SqlExpression)joinedMapping.Value2; + var innerColumn1 = (SqlExpression)expression1; + var innerColumn2 = (SqlExpression)expression2; // For now, make sure that both sides output the same store type, otherwise the query may fail. // TODO: with #15586 we'll be able to also allow different store types which are implicitly convertible to one another. if (innerColumn1.TypeMapping!.StoreType != innerColumn2.TypeMapping!.StoreType) @@ -1532,7 +1531,7 @@ private void ApplySetOperation(SetOperationType setOperationType, SelectExpressi innerColumn1 = (SqlExpression)aliasUniquifier.Visit(innerColumn1); var alias = GenerateUniqueColumnAlias( - joinedMapping.Key.Last?.Name + projectionMember.Last?.Name ?? (innerColumn1 as ColumnExpression)?.Name ?? "c"); @@ -1548,14 +1547,14 @@ private void ApplySetOperation(SetOperationType setOperationType, SelectExpressi outerProjection = outerProjection.MakeNullable(); } - _projectionMapping[joinedMapping.Key] = outerProjection; + _projectionMapping[projectionMember] = outerProjection; if (outerIdentifiers.Length > 0) { - var index = select1._identifier.FindIndex(e => e.Column.Equals(joinedMapping.Value1)); + var index = select1._identifier.FindIndex(e => e.Column.Equals(expression1)); if (index != -1) { - if (select2._identifier[index].Column.Equals(joinedMapping.Value2)) + if (select2._identifier[index].Column.Equals(expression2)) { outerIdentifiers[index] = outerProjection; } @@ -1865,9 +1864,9 @@ static TableReferenceExpression FindTableReference(SelectExpression selectExpres var newPropertyExpressions = new Dictionary(); var tableReferenceExpression = FindTableReference(selectExpression, tableExpressionBase); - foreach (var item in subqueryPropertyExpressions) + foreach (var (property, columnExpression) in subqueryPropertyExpressions) { - newPropertyExpressions[item.Key] = subquery.GenerateOuterColumn(tableReferenceExpression, item.Value); + newPropertyExpressions[property] = subquery.GenerateOuterColumn(tableReferenceExpression, columnExpression); } return newPropertyExpressions; @@ -1976,12 +1975,11 @@ private Expression AddJoin( var projectionMapping = new Dictionary(); var mapping = new Dictionary(); - foreach (var projection in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - var projectionMember = projection.Key; - var remappedProjectionMember = projection.Key.Prepend(outerMemberInfo); + var remappedProjectionMember = projectionMember.Prepend(outerMemberInfo); mapping[projectionMember] = remappedProjectionMember; - projectionMapping[remappedProjectionMember] = projection.Value; + projectionMapping[remappedProjectionMember] = expression; } outerShaper = new ProjectionMemberRemappingExpressionVisitor(this, mapping).Visit(outerShaper); @@ -2411,9 +2409,9 @@ static List ExtractColumnsFromProjectionMapping( IDictionary projectionMapping) { var result = new List(); - foreach (var mappingElement in projectionMapping) + foreach (var (projectionMember, expression) in projectionMapping) { - if (mappingElement.Value is EntityProjectionExpression entityProjection) + if (expression is EntityProjectionExpression entityProjection) { foreach (var property in GetAllPropertiesInHierarchy(entityProjection.EntityType)) { @@ -2426,7 +2424,7 @@ static List ExtractColumnsFromProjectionMapping( result.Add(discriminatorColumn); } } - else if (mappingElement.Value is ColumnExpression column) + else if (expression is ColumnExpression column) { result.Add(column); } @@ -2660,25 +2658,25 @@ private SqlRemappingVisitor PushdownIntoSubqueryInternal() } else { - foreach (var mapping in _projectionMapping.ToList()) + foreach (var (projectionMember, expression) in _projectionMapping.ToList()) { // If projectionMapping's value is ConstantExpression then projection has already been applied - if (mapping.Value is ConstantExpression) + if (expression is ConstantExpression) { break; } - if (mapping.Value is EntityProjectionExpression entityProjection) + if (expression is EntityProjectionExpression entityProjection) { - _projectionMapping[mapping.Key] = LiftEntityProjectionFromSubquery(entityProjection); + _projectionMapping[projectionMember] = LiftEntityProjectionFromSubquery(entityProjection); } else { - var innerColumn = (SqlExpression)mapping.Value; + var innerColumn = (SqlExpression)expression; var outerColumn = subquery.GenerateOuterColumn( - subqueryTableReferenceExpression, innerColumn, mapping.Key.Last?.Name); + subqueryTableReferenceExpression, innerColumn, projectionMember.Last?.Name); projectionMap[innerColumn] = outerColumn; - _projectionMapping[mapping.Key] = outerColumn; + _projectionMapping[projectionMember] = outerColumn; } } } @@ -2693,28 +2691,28 @@ private SqlRemappingVisitor PushdownIntoSubqueryInternal() var identifiers = _identifier.ToList(); _identifier.Clear(); - foreach (var identifier in identifiers) + foreach (var (column, comparer) in identifiers) { // Invariant, identifier should not contain term which cannot be projected out. - if (!projectionMap.TryGetValue(identifier.Column, out var outerColumn)) + if (!projectionMap.TryGetValue(column, out var outerColumn)) { - outerColumn = subquery.GenerateOuterColumn(subqueryTableReferenceExpression, identifier.Column); + outerColumn = subquery.GenerateOuterColumn(subqueryTableReferenceExpression, column); } - _identifier.Add((outerColumn, identifier.Comparer)); + _identifier.Add((outerColumn, Comparer: comparer)); } var childIdentifiers = _childIdentifiers.ToList(); _childIdentifiers.Clear(); - foreach (var identifier in childIdentifiers) + foreach (var (column, comparer) in childIdentifiers) { // Invariant, identifier should not contain term which cannot be projected out. - if (!projectionMap.TryGetValue(identifier.Column, out var outerColumn)) + if (!projectionMap.TryGetValue(column, out var outerColumn)) { - outerColumn = subquery.GenerateOuterColumn(subqueryTableReferenceExpression, identifier.Column); + outerColumn = subquery.GenerateOuterColumn(subqueryTableReferenceExpression, column); } - _childIdentifiers.Add((outerColumn, identifier.Comparer)); + _childIdentifiers.Add((outerColumn, Comparer: comparer)); } foreach (var ordering in subquery._orderings) @@ -3071,11 +3069,11 @@ protected override Expression VisitChildren(ExpressionVisitor visitor) else { var projectionMapping = new Dictionary(); - foreach (var mapping in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - var newProjection = visitor.Visit(mapping.Value); + var newProjection = visitor.Visit(expression); - projectionMapping[mapping.Key] = newProjection; + projectionMapping[projectionMember] = newProjection; } _projectionMapping = projectionMapping; @@ -3318,9 +3316,9 @@ public SelectExpression Update( SqlExpression? offset) { var projectionMapping = new Dictionary(); - foreach (var kvp in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - projectionMapping[kvp.Key] = kvp.Value; + projectionMapping[projectionMember] = expression; } var newTableReferences = _tableReferences.ToList(); @@ -3373,11 +3371,11 @@ protected override void Print(ExpressionPrinter expressionPrinter) expressionPrinter.AppendLine("Projection Mapping:"); using (expressionPrinter.Indent()) { - foreach (var projectionMappingEntry in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { expressionPrinter.AppendLine(); - expressionPrinter.Append(projectionMappingEntry.Key.ToString()).Append(" -> "); - expressionPrinter.Visit(projectionMappingEntry.Value); + expressionPrinter.Append(projectionMember.ToString()).Append(" -> "); + expressionPrinter.Visit(expression); } } } @@ -3514,10 +3512,10 @@ public override int GetHashCode() hash.Add(projection); } - foreach (var projectionMapping in _projectionMapping) + foreach (var (projectionMember, expression) in _projectionMapping) { - hash.Add(projectionMapping.Key); - hash.Add(projectionMapping.Value); + hash.Add(projectionMember); + hash.Add(expression); } foreach (var tag in Tags) diff --git a/src/EFCore.Relational/Update/Internal/CommandBatchPreparer.cs b/src/EFCore.Relational/Update/Internal/CommandBatchPreparer.cs index d9241777879..099058647df 100644 --- a/src/EFCore.Relational/Update/Internal/CommandBatchPreparer.cs +++ b/src/EFCore.Relational/Update/Internal/CommandBatchPreparer.cs @@ -282,22 +282,22 @@ private string FormatCycle( var builder = new StringBuilder(); for (var i = 0; i < data.Count; i++) { - var edge = data[i]; - Format(edge.Item1, builder); + var (command1, command2, annotatables) = data[i]; + Format(command1, builder); - switch (edge.Item3.First()) + switch (annotatables.First()) { case IForeignKey foreignKey: - Format(foreignKey, edge.Item1, edge.Item2, builder); + Format(foreignKey, command1, command2, builder); break; case IIndex index: - Format(index, edge.Item1, edge.Item2, builder); + Format(index, command1, command2, builder); break; } if (i == data.Count - 1) { - Format(edge.Item2, builder); + Format(command2, builder); } } diff --git a/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs b/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs index d844489352a..d1c3360784e 100644 --- a/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs +++ b/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs @@ -2473,16 +2473,16 @@ alterTableOperation.OldTable[SqlServerAnnotationNames.TemporalHistoryTableSchema } } - foreach (var periodMapEntry in periodMap) + foreach (var (key, value) in periodMap) { - EnablePeriod(periodMapEntry.Key.Item1!, periodMapEntry.Key.Item2, periodMapEntry.Value.Item1, periodMapEntry.Value.Item2); + EnablePeriod(key.Item1!, key.Item2, value.Item1, value.Item2); } - foreach (var versioningMapEntry in versioningMap) + foreach (var (key, value) in versioningMap) { EnableVersioning( - versioningMapEntry.Key.Item1!, versioningMapEntry.Key.Item2, versioningMapEntry.Value.Item1, - versioningMapEntry.Value.Item2); + key.Item1!, key.Item2, value.Item1, + value.Item2); } return operations; diff --git a/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs b/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs index 029c2d8a20c..eba607a761a 100644 --- a/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs +++ b/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs @@ -267,24 +267,24 @@ private IReadOnlyList RewriteOperations( var skippedRebuilds = new List<(string Table, string? Schema)>(); var indexesToRebuild = new List(); - foreach (var rebuild in rebuilds) + foreach (var (key, rebuildContext) in rebuilds) { - var table = model?.GetRelationalModel().FindTable(rebuild.Key.Table, rebuild.Key.Schema); + var table = model?.GetRelationalModel().FindTable(key.Table, key.Schema); if (table == null) { - skippedRebuilds.Add(rebuild.Key); + skippedRebuilds.Add(key); continue; } - foreach (var operationToWarnFor in rebuild.Value.OperationsToWarnFor) + foreach (var operationToWarnFor in rebuildContext.OperationsToWarnFor) { // TODO: Consider warning once per table--list all operation types we're warning for // TODO: Consider listing which operations required a rebuild Dependencies.MigrationsLogger.TableRebuildPendingWarning(operationToWarnFor.GetType(), table.Name); } - foreach (var operationToReplace in rebuild.Value.OperationsToReplace) + foreach (var operationToReplace in rebuildContext.OperationsToReplace) { operations.Remove(operationToReplace); } @@ -315,7 +315,7 @@ private IReadOnlyList RewriteOperations( Name = column.Name, ColumnType = column.StoreType, IsNullable = column.IsNullable, - DefaultValue = rebuild.Value.AddColumnsDeferred.TryGetValue(column.Name, out var originalOperation) + DefaultValue = rebuildContext.AddColumnsDeferred.TryGetValue(column.Name, out var originalOperation) && !originalOperation.IsNullable ? originalOperation.DefaultValue : defaultValue, @@ -349,7 +349,7 @@ private IReadOnlyList RewriteOperations( foreach (var index in table.Indexes) { - if (index.IsUnique && rebuild.Value.CreateIndexesDeferred.Contains(index.Name)) + if (index.IsUnique && rebuildContext.CreateIndexesDeferred.Contains(index.Name)) { var createIndexOperation = CreateIndexOperation.CreateFrom(index); createIndexOperation.Table = createTableOperation.Name; @@ -367,7 +367,7 @@ private IReadOnlyList RewriteOperations( foreach (var column in table.Columns) { if (column.ComputedColumnSql != null - || rebuild.Value.AddColumnsDeferred.ContainsKey(column.Name)) + || rebuildContext.AddColumnsDeferred.ContainsKey(column.Name)) { continue; } @@ -384,7 +384,7 @@ private IReadOnlyList RewriteOperations( intoBuilder.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(column.Name)); - var defaultValue = rebuild.Value.AlterColumnsDeferred.TryGetValue(column.Name, out var alterColumnOperation) + var defaultValue = rebuildContext.AlterColumnsDeferred.TryGetValue(column.Name, out var alterColumnOperation) && !alterColumnOperation.IsNullable && alterColumnOperation.OldColumn.IsNullable ? alterColumnOperation.DefaultValue @@ -396,7 +396,7 @@ private IReadOnlyList RewriteOperations( selectBuilder.Append( Dependencies.SqlGenerationHelper.DelimitIdentifier( - rebuild.Value.RenameColumnsDeferred.TryGetValue(column.Name, out var renameColumnOperation) + rebuildContext.RenameColumnsDeferred.TryGetValue(column.Name, out var renameColumnOperation) ? renameColumnOperation.Name : column.Name)); @@ -444,17 +444,17 @@ private IReadOnlyList RewriteOperations( new SqlOperation { Sql = "PRAGMA foreign_keys = 0;", SuppressTransaction = true }); } - foreach (var rebuild in rebuilds) + foreach (var ((table, schema), _) in rebuilds) { operations.Add( - new DropTableOperation { Name = rebuild.Key.Table, Schema = rebuild.Key.Schema }); + new DropTableOperation { Name = table, Schema = schema }); operations.Add( new RenameTableOperation { - Name = "ef_temp_" + rebuild.Key.Table, - Schema = rebuild.Key.Schema, - NewName = rebuild.Key.Table, - NewSchema = rebuild.Key.Schema + Name = "ef_temp_" + table, + Schema = schema, + NewName = table, + NewSchema = schema }); } diff --git a/src/EFCore/ChangeTracking/Internal/EntityReferenceMap.cs b/src/EFCore/ChangeTracking/Internal/EntityReferenceMap.cs index 8ae35858f96..2d287be31b9 100644 --- a/src/EFCore/ChangeTracking/Internal/EntityReferenceMap.cs +++ b/src/EFCore/ChangeTracking/Internal/EntityReferenceMap.cs @@ -131,11 +131,11 @@ public virtual bool TryGet( else { var type = entity.GetType(); - foreach (var keyValue in _sharedTypeReferenceMap) + foreach (var (key, entityReferenceMap) in _sharedTypeReferenceMap) { // ReSharper disable once CheckForReferenceEqualityInstead.2 - if (keyValue.Key.ClrType.IsAssignableFrom(type) - && keyValue.Value.TryGet(entity, entityType, out var foundEntry, throwOnNonUniqueness)) + if (key.ClrType.IsAssignableFrom(type) + && entityReferenceMap.TryGet(entity, entityType, out var foundEntry, throwOnNonUniqueness)) { if (found) { diff --git a/src/EFCore/ChangeTracking/Internal/KeyPropagator.cs b/src/EFCore/ChangeTracking/Internal/KeyPropagator.cs index 23bd46c86cd..3ff94eb7c17 100644 --- a/src/EFCore/ChangeTracking/Internal/KeyPropagator.cs +++ b/src/EFCore/ChangeTracking/Internal/KeyPropagator.cs @@ -144,11 +144,11 @@ public KeyPropagator( } else if (foreignKey.PrincipalToDependent != null) { - foreach (var danglerEntry in stateManager.GetRecordedReferrers(entry.Entity, clear: false)) + foreach (var (navigationBase, internalEntityEntry) in stateManager.GetRecordedReferrers(entry.Entity, clear: false)) { - if (danglerEntry.Item1 == foreignKey.PrincipalToDependent) + if (navigationBase == foreignKey.PrincipalToDependent) { - principalEntry = danglerEntry.Item2; + principalEntry = internalEntityEntry; break; } } diff --git a/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs b/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs index e5350d6a12a..56ae0d3fa44 100644 --- a/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs +++ b/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs @@ -902,9 +902,9 @@ private void InitialFixup( // If the entity was previously referenced while it was still untracked, go back and do the fixup // that we would have done then now that the entity is tracked. - foreach (var danglerEntry in stateManager.GetRecordedReferrers(entry.Entity, clear: true)) + foreach (var (navigationBase, internalEntityEntry) in stateManager.GetRecordedReferrers(entry.Entity, clear: true)) { - DelayedFixup(danglerEntry.Item2, danglerEntry.Item1, entry, fromQuery); + DelayedFixup(internalEntityEntry, navigationBase, entry, fromQuery); } } } diff --git a/src/EFCore/ChangeTracking/Internal/StateManager.cs b/src/EFCore/ChangeTracking/Internal/StateManager.cs index b7915bbbd29..d0ce775df34 100644 --- a/src/EFCore/ChangeTracking/Internal/StateManager.cs +++ b/src/EFCore/ChangeTracking/Internal/StateManager.cs @@ -595,17 +595,17 @@ public virtual void StopTracking(InternalEntityEntry entry, EntityState oldState if (_referencedUntrackedEntities != null) { - foreach (var keyValuePair in _referencedUntrackedEntities.ToList()) + foreach (var (key, value) in _referencedUntrackedEntities.ToList()) { - if (keyValuePair.Value.Any(t => t.Item2 == entry)) + if (value.Any(t => t.Item2 == entry)) { - _referencedUntrackedEntities.Remove(keyValuePair.Key); + _referencedUntrackedEntities.Remove(key); - var newList = keyValuePair.Value.Where(tuple => tuple.Item2 != entry).ToList(); + var newList = value.Where(tuple => tuple.Item2 != entry).ToList(); if (newList.Count > 0) { - _referencedUntrackedEntities.Add(keyValuePair.Key, newList); + _referencedUntrackedEntities.Add(key, newList); } } } diff --git a/src/EFCore/DbContextOptions.cs b/src/EFCore/DbContextOptions.cs index d3fb5a6adb3..e618baca285 100644 --- a/src/EFCore/DbContextOptions.cs +++ b/src/EFCore/DbContextOptions.cs @@ -151,10 +151,10 @@ public override int GetHashCode() { var hashCode = new HashCode(); - foreach (var dbContextOptionsExtension in _extensionsMap) + foreach (var (type, value) in _extensionsMap) { - hashCode.Add(dbContextOptionsExtension.Key); - hashCode.Add(dbContextOptionsExtension.Value.Extension.Info.GetServiceProviderHashCode()); + hashCode.Add(type); + hashCode.Add(value.Extension.Info.GetServiceProviderHashCode()); } return hashCode.ToHashCode(); diff --git a/src/EFCore/Design/Internal/CSharpRuntimeAnnotationCodeGenerator.cs b/src/EFCore/Design/Internal/CSharpRuntimeAnnotationCodeGenerator.cs index ea217e14c88..29e12b31e6c 100644 --- a/src/EFCore/Design/Internal/CSharpRuntimeAnnotationCodeGenerator.cs +++ b/src/EFCore/Design/Internal/CSharpRuntimeAnnotationCodeGenerator.cs @@ -30,13 +30,13 @@ public virtual void Generate(IModel model, CSharpRuntimeAnnotationCodeGeneratorP var annotations = parameters.Annotations; if (!parameters.IsRuntime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key) - && annotation.Key != CoreAnnotationNames.ProductVersion - && annotation.Key != CoreAnnotationNames.FullChangeTrackingNotificationsRequired) + if (CoreAnnotationNames.AllNames.Contains(key) + && key != CoreAnnotationNames.ProductVersion + && key != CoreAnnotationNames.FullChangeTrackingNotificationsRequired) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -55,12 +55,12 @@ public virtual void Generate(IEntityType entityType, CSharpRuntimeAnnotationCode var annotations = parameters.Annotations; if (!parameters.IsRuntime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key) - && annotation.Key != CoreAnnotationNames.DiscriminatorMappingComplete) + if (CoreAnnotationNames.AllNames.Contains(key) + && key != CoreAnnotationNames.DiscriminatorMappingComplete) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -74,11 +74,11 @@ public virtual void Generate(IProperty property, CSharpRuntimeAnnotationCodeGene if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -92,11 +92,11 @@ public virtual void Generate(IServiceProperty property, CSharpRuntimeAnnotationC if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -110,11 +110,11 @@ public virtual void Generate(IKey key, CSharpRuntimeAnnotationCodeGeneratorParam if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (s, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(s)) { - annotations.Remove(annotation.Key); + annotations.Remove(s); } } } @@ -128,11 +128,11 @@ public virtual void Generate(IForeignKey foreignKey, CSharpRuntimeAnnotationCode if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -146,11 +146,11 @@ public virtual void Generate(INavigation navigation, CSharpRuntimeAnnotationCode if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -164,11 +164,11 @@ public virtual void Generate(ISkipNavigation navigation, CSharpRuntimeAnnotation if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -182,11 +182,11 @@ public virtual void Generate(IIndex index, CSharpRuntimeAnnotationCodeGeneratorP if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -200,11 +200,11 @@ public virtual void Generate(ITypeMappingConfiguration typeConfiguration, CSharp if (!parameters.IsRuntime) { var annotations = parameters.Annotations; - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } diff --git a/src/EFCore/Diagnostics/CoreLoggerExtensions.cs b/src/EFCore/Diagnostics/CoreLoggerExtensions.cs index a72d7aec15b..62ef2313cb8 100644 --- a/src/EFCore/Diagnostics/CoreLoggerExtensions.cs +++ b/src/EFCore/Diagnostics/CoreLoggerExtensions.cs @@ -1690,14 +1690,14 @@ private static string NonOwnershipInverseNavigationWarning(EventDefinitionBase d { var d = (EventDefinition)definition; var p = (TwoUnmappedPropertyCollectionsEventData)payload; - var navigation = p.FirstPropertyCollection.First(); - var inverseNavigation = p.SecondPropertyCollection.First(); + var (memberInfo1, type1) = p.FirstPropertyCollection.First(); + var (memberInfo2, type2) = p.SecondPropertyCollection.First(); var ownershipNavigation = p.SecondPropertyCollection.Last(); return d.GenerateMessage( - inverseNavigation.Item2.ShortDisplayName(), - inverseNavigation.Item1?.Name, - navigation.Item2.ShortDisplayName(), - navigation.Item1?.Name, + type2.ShortDisplayName(), + memberInfo2?.Name, + type1.ShortDisplayName(), + memberInfo1?.Name, ownershipNavigation.Item1?.Name); } @@ -1756,15 +1756,15 @@ private static string ForeignKeyAttributesOnBothPropertiesWarning(EventDefinitio { var d = (EventDefinition)definition; var p = (TwoUnmappedPropertyCollectionsEventData)payload; - var firstNavigation = p.FirstPropertyCollection.First(); + var (memberInfo1, type1) = p.FirstPropertyCollection.First(); var firstProperty = p.FirstPropertyCollection.Last(); - var secondNavigation = p.SecondPropertyCollection.First(); + var (memberInfo2, type2) = p.SecondPropertyCollection.First(); var secondProperty = p.SecondPropertyCollection.Last(); return d.GenerateMessage( - firstNavigation.Item2.ShortDisplayName(), - firstNavigation.Item1?.Name, - secondNavigation.Item2.ShortDisplayName(), - secondNavigation.Item1?.Name, + type1.ShortDisplayName(), + memberInfo1?.Name, + type2.ShortDisplayName(), + memberInfo2?.Name, firstProperty.Item1?.Name, secondProperty.Item1?.Name); } @@ -1858,13 +1858,13 @@ private static string ConflictingForeignKeyAttributesOnNavigationAndPropertyWarn { var d = (EventDefinition)definition; var p = (TwoUnmappedPropertyCollectionsEventData)payload; - var navigation = p.FirstPropertyCollection.First(); - var property = p.SecondPropertyCollection.First(); + var (memberInfo1, type1) = p.FirstPropertyCollection.First(); + var (memberInfo2, type2) = p.SecondPropertyCollection.First(); return d.GenerateMessage( - navigation.Item2.ShortDisplayName(), - navigation.Item1?.Name, - property.Item2.ShortDisplayName(), - property.Item1?.Name); + type1.ShortDisplayName(), + memberInfo1?.Name, + type2.ShortDisplayName(), + memberInfo2?.Name); } /// diff --git a/src/EFCore/Diagnostics/WarningsConfiguration.cs b/src/EFCore/Diagnostics/WarningsConfiguration.cs index 9826fabdeec..3c3cc4b74b2 100644 --- a/src/EFCore/Diagnostics/WarningsConfiguration.cs +++ b/src/EFCore/Diagnostics/WarningsConfiguration.cs @@ -191,10 +191,10 @@ public virtual int GetServiceProviderHashCode() var hashCode = new HashCode(); hashCode.Add(_defaultBehavior); - foreach (var explicitBehavior in _explicitBehaviors) + foreach (var (key, value) in _explicitBehaviors) { - hashCode.Add(explicitBehavior.Key); - hashCode.Add(explicitBehavior.Value); + hashCode.Add(key); + hashCode.Add(value); } _serviceProviderHash = hashCode.ToHashCode(); diff --git a/src/EFCore/Metadata/Conventions/InversePropertyAttributeConvention.cs b/src/EFCore/Metadata/Conventions/InversePropertyAttributeConvention.cs index 382111653f3..024e643c0d3 100644 --- a/src/EFCore/Metadata/Conventions/InversePropertyAttributeConvention.cs +++ b/src/EFCore/Metadata/Conventions/InversePropertyAttributeConvention.cs @@ -471,17 +471,17 @@ public override void ProcessEntityTypeBaseTypeChanged( continue; } - foreach (var inverseNavigation in inverseNavigations.Values) + foreach (var (navigation, references) in inverseNavigations.Values) { - foreach (var referencingNavigationWithAttribute in inverseNavigation.References) + foreach (var (memberInfo, conventionEntityType) in references) { if (TryRemoveIfAmbiguous( - referencingNavigationWithAttribute.Item2, - referencingNavigationWithAttribute.Item1, + conventionEntityType, + memberInfo, entityType, newBaseType, - inverseNavigation.Navigation, - inverseNavigation.References, + navigation, + references, out _)) { break; @@ -542,14 +542,14 @@ public virtual void ProcessModelFinalizing( continue; } - foreach (var inverseNavigation in inverseNavigations.Values) + foreach (var (navigation, references) in inverseNavigations.Values) { - foreach (var referencingNavigationWithAttribute in inverseNavigation.References) + foreach (var (memberInfo, conventionEntityType) in references) { var ambiguousInverse = FindAmbiguousInverse( - referencingNavigationWithAttribute.Item1, - referencingNavigationWithAttribute.Item2, - inverseNavigation.References); + memberInfo, + conventionEntityType, + references); var baseType = entityType.BaseType; while (ambiguousInverse == null @@ -557,12 +557,12 @@ public virtual void ProcessModelFinalizing( { var navigationMap = GetInverseNavigations(baseType); if (navigationMap != null - && navigationMap.TryGetValue(inverseNavigation.Navigation.Name, out var inverseTuple)) + && navigationMap.TryGetValue(navigation.Name, out var inverseTuple)) { var referencingNavigationsWithAttribute = inverseTuple.References; ambiguousInverse = FindAmbiguousInverse( - referencingNavigationWithAttribute.Item1, - referencingNavigationWithAttribute.Item2, + memberInfo, + conventionEntityType, referencingNavigationsWithAttribute); } @@ -575,10 +575,10 @@ public virtual void ProcessModelFinalizing( new[] { Tuple.Create( - referencingNavigationWithAttribute.Item1, referencingNavigationWithAttribute.Item2.ClrType), + memberInfo, conventionEntityType.ClrType), Tuple.Create(ambiguousInverse.Value.Item1, ambiguousInverse.Value.Item2.ClrType) }, - inverseNavigation.Navigation, + navigation, entityType.ClrType); break; } @@ -618,10 +618,10 @@ public static bool IsAmbiguous( var navigationMap = GetInverseNavigations(currentEntityType); if (navigationMap != null) { - foreach (var inverseNavigationTuple in navigationMap.Values) + foreach (var (memberInfo, references) in navigationMap.Values) { - if (inverseNavigationTuple.Navigation.GetMemberType().IsAssignableFrom(entityType.ClrType) - && IsAmbiguousInverse(navigation, entityType, inverseNavigationTuple.References)) + if (memberInfo.GetMemberType().IsAssignableFrom(entityType.ClrType) + && IsAmbiguousInverse(navigation, entityType, references)) { return true; } @@ -691,11 +691,11 @@ private static (MemberInfo, IConventionEntityType)? FindAmbiguousInverse( referencingNavigationsWithAttribute = inverseTuple.References; } - foreach (var referencingTuple in referencingNavigationsWithAttribute) + foreach (var (memberInfo, conventionEntityType) in referencingNavigationsWithAttribute) { - if (referencingTuple.Item1.IsSameAs(navigation) - && referencingTuple.Item2.ClrType == entityType.ClrType - && FindActualEntityType(referencingTuple.Item2) == entityType) + if (memberInfo.IsSameAs(navigation) + && conventionEntityType.ClrType == entityType.ClrType + && FindActualEntityType(conventionEntityType) == entityType) { return referencingNavigationsWithAttribute; } @@ -724,7 +724,7 @@ private static void RemoveInverseNavigation( var (inverseNavigation, referencingNavigationsWithAttribute) = inverseNavigationPair; for (var index = 0; index < referencingNavigationsWithAttribute.Count; index++) { - var referencingTuple = referencingNavigationsWithAttribute[index]; + var (memberInfo, conventionEntityType) = referencingNavigationsWithAttribute[index]; if (navigation == null) { anyRemoved = true; @@ -734,7 +734,7 @@ private static void RemoveInverseNavigation( inverseNavigations.Remove(inverseNavigation.Name); } - var otherEntityType = FindActualEntityType(referencingTuple.Item2); + var otherEntityType = FindActualEntityType(conventionEntityType); if (otherEntityType != null) { // TODO: Rely on layering to trigger relationship discovery instead #15898 @@ -746,7 +746,7 @@ private static void RemoveInverseNavigation( { otherEntityType.Builder.HasRelationship( targetEntityType, - referencingTuple.Item1, + memberInfo, null); } else if (existingInverses.Count == 1) @@ -758,7 +758,7 @@ private static void RemoveInverseNavigation( // to override the null navigation configuration #15898 otherEntityType.Builder.HasRelationship( targetEntityType, - referencingTuple.Item1, + memberInfo, existingInverse.PropertyInfo, fromDataAnnotation: true); } @@ -766,17 +766,17 @@ private static void RemoveInverseNavigation( { otherEntityType.Builder.HasRelationship( targetEntityType, - referencingTuple.Item1, + memberInfo, null); } } } } - else if (referencingTuple.Item1.IsSameAs(navigation) - && ((!referencingTuple.Item2.IsInModel - && declaringType!.IsAssignableFrom(referencingTuple.Item2.ClrType)) - || (referencingTuple.Item2.IsInModel - && declaringEntityType!.IsAssignableFrom(referencingTuple.Item2)))) + else if (memberInfo.IsSameAs(navigation) + && ((!conventionEntityType.IsInModel + && declaringType!.IsAssignableFrom(conventionEntityType.ClrType)) + || (conventionEntityType.IsInModel + && declaringEntityType!.IsAssignableFrom(conventionEntityType)))) { anyRemoved = true; referencingNavigationsWithAttribute.RemoveAt(index--); diff --git a/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs b/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs index f88f8f6a6a2..313bb87f51f 100644 --- a/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs +++ b/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs @@ -188,9 +188,8 @@ private IReadOnlyList FindRelationshipCandidates( if (!entityType.IsKeyless) { var inverseCandidates = Dependencies.MemberClassifier.GetNavigationCandidates(candidateTargetEntityType); - foreach (var inverseCandidateTuple in inverseCandidates) + foreach (var (inversePropertyInfo, value) in inverseCandidates) { - var inversePropertyInfo = inverseCandidateTuple.Key; if (navigationPropertyInfo.IsSameAs(inversePropertyInfo) || (candidateTargetEntityType.FindNavigation(inversePropertyInfo) == null && candidateTargetEntityType.FindSkipNavigation(inversePropertyInfo) == null @@ -200,7 +199,7 @@ private IReadOnlyList FindRelationshipCandidates( continue; } - var inverseTargetType = inverseCandidateTuple.Value.Type; + var inverseTargetType = value.Type; var inverseIsCollection = inverseTargetType != inversePropertyInfo.PropertyType; if (inverseTargetType != entityType.ClrType && (!inverseTargetType.IsAssignableFrom(entityType.ClrType) @@ -1177,21 +1176,20 @@ private bool ProcessEntityTypeMemberIgnoredOnBase(IConventionEntityType entityTy } var ambiguousNavigationFound = false; - foreach (var navigation in ambiguousNavigations) + foreach (var (memberInfo, targetClrType) in ambiguousNavigations) { - if (navigation.Key.GetSimpleMemberName() != name - && navigation.Key.GetMemberType() != property.PropertyType) + if (memberInfo.GetSimpleMemberName() != name + && memberInfo.GetMemberType() != property.PropertyType) { continue; } ambiguousNavigationFound = true; - var targetClrType = navigation.Value; RemoveAmbiguous(entityType, targetClrType); var targetType = TryGetTargetEntityTypeBuilder( - entityType.Builder, targetClrType, navigation.Key, shouldCreate: false)?.Metadata; + entityType.Builder, targetClrType, memberInfo, shouldCreate: false)?.Metadata; if (targetType != null) { RemoveAmbiguous(targetType, entityType.ClrType); @@ -1223,20 +1221,19 @@ public virtual void ProcessForeignKeyNullNavigationSet( } var ambiguousNavigationFound = false; - foreach (var navigation in ambiguousNavigations) + foreach (var (memberInfo, targetClrType) in ambiguousNavigations) { - if (navigation.Value != targetEntityType.ClrType) + if (targetClrType != targetEntityType.ClrType) { continue; } ambiguousNavigationFound = true; - var targetClrType = navigation.Value; RemoveAmbiguous(entityType, targetClrType); var targetType = TryGetTargetEntityTypeBuilder( - entityType.Builder, targetClrType, navigation.Key, shouldCreate: false)?.Metadata; + entityType.Builder, targetClrType, memberInfo, shouldCreate: false)?.Metadata; if (targetType != null) { RemoveAmbiguous(targetType, entityType.ClrType); @@ -1367,11 +1364,11 @@ private static bool RemoveAmbiguous(IConventionEntityType entityType, Type targe if (ambiguousNavigations?.IsEmpty == false) { var newAmbiguousNavigations = ambiguousNavigations; - foreach (var ambiguousNavigation in ambiguousNavigations) + foreach (var (memberInfo, type) in ambiguousNavigations) { - if (targetType.IsAssignableFrom(ambiguousNavigation.Value)) + if (targetType.IsAssignableFrom(type)) { - newAmbiguousNavigations = newAmbiguousNavigations.Remove(ambiguousNavigation.Key); + newAmbiguousNavigations = newAmbiguousNavigations.Remove(memberInfo); } } diff --git a/src/EFCore/Metadata/Conventions/RuntimeModelConvention.cs b/src/EFCore/Metadata/Conventions/RuntimeModelConvention.cs index b7e8784e41e..93fdd6ccf8e 100644 --- a/src/EFCore/Metadata/Conventions/RuntimeModelConvention.cs +++ b/src/EFCore/Metadata/Conventions/RuntimeModelConvention.cs @@ -200,13 +200,13 @@ protected virtual void ProcessModelAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key) - && annotation.Key != CoreAnnotationNames.ProductVersion - && annotation.Key != CoreAnnotationNames.FullChangeTrackingNotificationsRequired) + if (CoreAnnotationNames.AllNames.Contains(key) + && key != CoreAnnotationNames.ProductVersion + && key != CoreAnnotationNames.FullChangeTrackingNotificationsRequired) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -256,16 +256,16 @@ protected virtual void ProcessEntityTypeAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key) - && annotation.Key != CoreAnnotationNames.QueryFilter + if (CoreAnnotationNames.AllNames.Contains(key) + && key != CoreAnnotationNames.QueryFilter #pragma warning disable CS0612 // Type or member is obsolete - && annotation.Key != CoreAnnotationNames.DefiningQuery + && key != CoreAnnotationNames.DefiningQuery #pragma warning restore CS0612 // Type or member is obsolete - && annotation.Key != CoreAnnotationNames.DiscriminatorMappingComplete) + && key != CoreAnnotationNames.DiscriminatorMappingComplete) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } @@ -317,11 +317,11 @@ protected virtual void ProcessTypeMappingConfigurationAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -365,11 +365,11 @@ protected virtual void ProcessPropertyAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -397,11 +397,11 @@ protected virtual void ProcessServicePropertyAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -425,11 +425,11 @@ protected virtual void ProcessKeyAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (s, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(s)) { - annotations.Remove(annotation.Key); + annotations.Remove(s); } } } @@ -456,11 +456,11 @@ protected virtual void ProcessIndexAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -495,11 +495,11 @@ protected virtual void ProcessForeignKeyAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -532,11 +532,11 @@ protected virtual void ProcessNavigationAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } @@ -605,11 +605,11 @@ protected virtual void ProcessSkipNavigationAnnotations( { if (!runtime) { - foreach (var annotation in annotations) + foreach (var (key, _) in annotations) { - if (CoreAnnotationNames.AllNames.Contains(annotation.Key)) + if (CoreAnnotationNames.AllNames.Contains(key)) { - annotations.Remove(annotation.Key); + annotations.Remove(key); } } } diff --git a/src/EFCore/Metadata/Internal/InternalEntityTypeBuilder.cs b/src/EFCore/Metadata/Internal/InternalEntityTypeBuilder.cs index 27ff819409e..8b676fb8c13 100644 --- a/src/EFCore/Metadata/Internal/InternalEntityTypeBuilder.cs +++ b/src/EFCore/Metadata/Internal/InternalEntityTypeBuilder.cs @@ -1760,11 +1760,11 @@ public virtual bool CanSetDefiningQuery(LambdaExpression? query, ConfigurationSo if (detachedKeys != null) { - foreach (var detachedKeyTuple in detachedKeys) + foreach (var (internalKeyBuilder, value) in detachedKeys) { - var newKeyBuilder = detachedKeyTuple.Item1.Attach(Metadata.RootType().Builder, detachedKeyTuple.Item2); + var newKeyBuilder = internalKeyBuilder.Attach(Metadata.RootType().Builder, value); if (newKeyBuilder == null - && detachedKeyTuple.Item1.Metadata.GetConfigurationSource() == ConfigurationSource.Explicit) + && internalKeyBuilder.Metadata.GetConfigurationSource() == ConfigurationSource.Explicit) { throw new InvalidOperationException(CoreStrings.DerivedEntityCannotHaveKeys(Metadata.DisplayName())); } @@ -3002,9 +3002,7 @@ private static InternalIndexBuilder DetachIndex(Index indexToDetach) } else { - var navigation = navigationToTarget; - navigationToTarget = inverseNavigation; - inverseNavigation = navigation; + (navigationToTarget, inverseNavigation) = (inverseNavigation, navigationToTarget); navigationProperty = navigationToTarget?.MemberInfo; inverseProperty = inverseNavigation?.MemberInfo; @@ -4229,9 +4227,9 @@ private static bool Contains(IReadOnlyForeignKey? inheritedFk, IReadOnlyForeignK if (detachedNavigations != null) { - foreach (var detachedSkipNavigationTuple in detachedNavigations) + foreach (var (navigation, inverse) in detachedNavigations) { - detachedSkipNavigationTuple.Navigation.Attach(this, inverseBuilder: detachedSkipNavigationTuple.Inverse); + navigation.Attach(this, inverseBuilder: inverse); } } } diff --git a/src/EFCore/Metadata/Internal/InternalForeignKeyBuilder.cs b/src/EFCore/Metadata/Internal/InternalForeignKeyBuilder.cs index 62bc4de3236..780429f1c62 100644 --- a/src/EFCore/Metadata/Internal/InternalForeignKeyBuilder.cs +++ b/src/EFCore/Metadata/Internal/InternalForeignKeyBuilder.cs @@ -248,13 +248,8 @@ public InternalForeignKeyBuilder( configurationSource.Overrides(Metadata.GetPrincipalKeyConfigurationSource()), "configurationSource does not override Metadata.GetPrincipalKeyConfigurationSource"); - var entityType = principalEntityType; - principalEntityType = dependentEntityType; - dependentEntityType = entityType; - - var navigation = navigationToPrincipal; - navigationToPrincipal = navigationToDependent; - navigationToDependent = navigation; + (principalEntityType, dependentEntityType) = (dependentEntityType, principalEntityType); + (navigationToPrincipal, navigationToDependent) = (navigationToDependent, navigationToPrincipal); navigationToPrincipalName = navigationToPrincipal?.Name; navigationToDependentName = navigationToDependent?.Name; @@ -1601,9 +1596,9 @@ public virtual bool CanInvert( if (detachedKeys != null) { - foreach (var detachedKeyTuple in detachedKeys) + foreach (var (internalKeyBuilder, configurationSource) in detachedKeys) { - detachedKeyTuple.Item1.Attach(Metadata.DeclaringEntityType.RootType().Builder, detachedKeyTuple.Item2); + internalKeyBuilder.Attach(Metadata.DeclaringEntityType.RootType().Builder, configurationSource); } } @@ -2309,13 +2304,8 @@ private bool CanSetPrincipalKey( oldRelationshipInverted = !oldRelationshipInverted; existingRelationshipInverted = false; - var entityTypeBuilder = principalEntityTypeBuilder; - principalEntityTypeBuilder = dependentEntityTypeBuilder; - dependentEntityTypeBuilder = entityTypeBuilder; - - var navigation = navigationToPrincipal; - navigationToPrincipal = navigationToDependent; - navigationToDependent = navigation; + (principalEntityTypeBuilder, dependentEntityTypeBuilder) = (dependentEntityTypeBuilder, principalEntityTypeBuilder); + (navigationToPrincipal, navigationToDependent) = (navigationToDependent, navigationToPrincipal); dependentProperties = null; principalProperties = null; diff --git a/src/EFCore/Metadata/Internal/PropertiesSnapshot.cs b/src/EFCore/Metadata/Internal/PropertiesSnapshot.cs index c5e10bcd547..22d1620b55d 100644 --- a/src/EFCore/Metadata/Internal/PropertiesSnapshot.cs +++ b/src/EFCore/Metadata/Internal/PropertiesSnapshot.cs @@ -106,9 +106,9 @@ public virtual void Attach(InternalEntityTypeBuilder entityTypeBuilder) if (Keys != null) { - foreach (var detachedKeyTuple in Keys) + foreach (var (internalKeyBuilder, configurationSource) in Keys) { - detachedKeyTuple.Item1.Attach(entityTypeBuilder.Metadata.RootType().Builder, detachedKeyTuple.Item2); + internalKeyBuilder.Attach(entityTypeBuilder.Metadata.RootType().Builder, configurationSource); } } diff --git a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.ExpressionVisitors.cs b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.ExpressionVisitors.cs index a92ec18eb34..83edd382d40 100644 --- a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.ExpressionVisitors.cs +++ b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.ExpressionVisitors.cs @@ -698,10 +698,8 @@ private Expression ExpandInclude(Expression root, EntityReference entityReferenc private static void VerifyNoCycles(IncludeTreeNode includeTreeNode) { - foreach (var keyValuePair in includeTreeNode) + foreach (var (navigation, referenceIncludeTreeNode) in includeTreeNode) { - var navigation = keyValuePair.Key; - var referenceIncludeTreeNode = keyValuePair.Value; var inverseNavigation = navigation.Inverse; if (inverseNavigation != null && referenceIncludeTreeNode.ContainsKey(inverseNavigation)) @@ -717,9 +715,8 @@ private Expression ExpandIncludesHelper(Expression root, EntityReference entityR { var result = root; var convertedRoot = root; - foreach (var kvp in entityReference.IncludePaths) + foreach (var (navigationBase, includeTreeNode) in entityReference.IncludePaths) { - var navigationBase = kvp.Key; if (!navigationBase.IsCollection && previousNavigation?.Inverse == navigationBase) { @@ -878,7 +875,7 @@ private Expression ExpandIncludesHelper(Expression root, EntityReference entityR } } - result = new IncludeExpression(result, included, navigationBase, kvp.Value.SetLoaded); + result = new IncludeExpression(result, included, navigationBase, includeTreeNode.SetLoaded); } return result; diff --git a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.Expressions.cs b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.Expressions.cs index a1b4142aed8..6e3eadcd0c8 100644 --- a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.Expressions.cs +++ b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.Expressions.cs @@ -71,10 +71,10 @@ void PrintInclude(IncludeTreeNode currentNode) { using (expressionPrinter.Indent()) { - foreach (var child in currentNode) + foreach (var (navigationBase, includeTreeNode) in currentNode) { - expressionPrinter.AppendLine(@"\-> " + child.Key.Name); - PrintInclude(child.Value); + expressionPrinter.AppendLine(@"\-> " + navigationBase.Name); + PrintInclude(includeTreeNode); } } } @@ -150,9 +150,9 @@ public IncludeTreeNode Snapshot(EntityReference? entityReference) { var result = new IncludeTreeNode(EntityType, entityReference, SetLoaded) { FilterExpression = FilterExpression }; - foreach (var kvp in this) + foreach (var (navigationBase, includeTreeNode) in this) { - result[kvp.Key] = kvp.Value.Snapshot(null); + result[navigationBase] = includeTreeNode.Snapshot(null); } return result; @@ -162,9 +162,9 @@ public void Merge(IncludeTreeNode includeTreeNode) { // EntityReference is intentionally ignored FilterExpression = includeTreeNode.FilterExpression; - foreach (var item in includeTreeNode) + foreach (var (navigationBase, value) in includeTreeNode) { - AddNavigation(item.Key, item.Value.SetLoaded).Merge(item.Value); + AddNavigation(navigationBase, value.SetLoaded).Merge(value); } } @@ -187,10 +187,10 @@ private bool Equals(IncludeTreeNode includeTreeNode) return false; } - foreach (var kvp in this) + foreach (var (navigationBase, value) in this) { - if (!includeTreeNode.TryGetValue(kvp.Key, out var otherIncludeTreeNode) - || !kvp.Value.Equals(otherIncludeTreeNode)) + if (!includeTreeNode.TryGetValue(navigationBase, out var otherIncludeTreeNode) + || !value.Equals(otherIncludeTreeNode)) { return false; } diff --git a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs index 4a0fc2686ed..9e552d4c07b 100644 --- a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs +++ b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs @@ -116,16 +116,16 @@ public virtual Expression Expand(Expression query) QueryContextContextPropertyInfo), _queryCompilationContext.ContextType); - foreach (var parameterValue in _parameters.ParameterValues) + foreach (var (key, value) in _parameters.ParameterValues) { - var lambda = (LambdaExpression)parameterValue.Value!; + var lambda = (LambdaExpression)value!; var remappedLambdaBody = ReplacingExpressionVisitor.Replace( lambda.Parameters[0], dbContextOnQueryContextPropertyAccess, lambda.Body); _queryCompilationContext.RegisterRuntimeParameter( - parameterValue.Key, + key, Expression.Lambda( remappedLambdaBody.Type.IsValueType ? Expression.Convert(remappedLambdaBody, typeof(object)) diff --git a/src/EFCore/Storage/ValueConversion/ValueConverterSelector.cs b/src/EFCore/Storage/ValueConversion/ValueConverterSelector.cs index 06f2283b4d5..3d349c38094 100644 --- a/src/EFCore/Storage/ValueConversion/ValueConverterSelector.cs +++ b/src/EFCore/Storage/ValueConversion/ValueConverterSelector.cs @@ -392,14 +392,15 @@ private IEnumerable EnumToStringOrBytes( (underlyingModelType, typeof(byte[])), static k => { + var (modelClrType, _) = k; var toNumber = GetDefaultValueConverterInfo( - typeof(EnumToNumberConverter<,>).MakeGenericType(k.ModelClrType, k.ModelClrType.GetEnumUnderlyingType())); + typeof(EnumToNumberConverter<,>).MakeGenericType(modelClrType, modelClrType.GetEnumUnderlyingType())); var toBytes = GetDefaultValueConverterInfo( - typeof(NumberToBytesConverter<>).MakeGenericType(k.ModelClrType.GetEnumUnderlyingType())); + typeof(NumberToBytesConverter<>).MakeGenericType(modelClrType.GetEnumUnderlyingType())); return new ValueConverterInfo( - k.ModelClrType, + modelClrType, typeof(byte[]), _ => toNumber.Create().ComposeWith(toBytes.Create()), toBytes.MappingHints); diff --git a/src/Shared/DictionaryExtensions.cs b/src/Shared/DictionaryExtensions.cs index a7979ebb864..bee91f23fe7 100644 --- a/src/Shared/DictionaryExtensions.cs +++ b/src/Shared/DictionaryExtensions.cs @@ -92,11 +92,11 @@ public static void Remove( return; } - foreach (var pair in pairsRemainder) + foreach (var (key, value) in pairsRemainder) { - if (predicate(pair.Key, pair.Value, state)) + if (predicate(key, value, state)) { - source.Remove(pair.Key); + source.Remove(key); } } } diff --git a/src/Shared/Multigraph.cs b/src/Shared/Multigraph.cs index 8ec22e1f80e..abb758eea98 100644 --- a/src/Shared/Multigraph.cs +++ b/src/Shared/Multigraph.cs @@ -105,9 +105,9 @@ public IReadOnlyList TopologicalSort( { var queue = new List(); var predecessorCounts = new Dictionary(_predecessorMap.Count); - foreach (var predecessor in _predecessorMap) + foreach (var (vertex, vertices) in _predecessorMap) { - predecessorCounts[predecessor.Key] = predecessor.Value.Count; + predecessorCounts[vertex] = vertices.Count; } foreach (var vertex in _vertices) @@ -263,9 +263,9 @@ public IReadOnlyList> BatchingTopologicalSort( { var currentRootsQueue = new List(); var predecessorCounts = new Dictionary(_predecessorMap.Count); - foreach (var predecessor in _predecessorMap) + foreach (var (vertex, vertices) in _predecessorMap) { - predecessorCounts[predecessor.Key] = predecessor.Value.Count; + predecessorCounts[vertex] = vertices.Count; } foreach (var vertex in _vertices)