From f58fccec6e687346fcab4356015faae90e24ff51 Mon Sep 17 00:00:00 2001 From: AndriySvyryd Date: Fri, 7 Jun 2019 16:58:21 -0700 Subject: [PATCH] Move extensions classes to consistent locations Fixes #14842 --- EFCore.sln.DotSettings | 2 + .../CosmosDbContextOptionsExtensions.cs | 1 + .../Extensions/CosmosLoggerExtensions.cs | 1 + .../CosmosServiceCollectionExtensions.cs | 1 + .../Design/Internal/DbContextOperations.cs | 1 + .../Internal/InMemoryLoggerExtensions.cs | 0 ...emoryProjectionBindingExpressionVisitor.cs | 2 +- .../Query/Pipeline/Translator.cs | 2 +- .../Internal/MethodInfoExtensions.cs | 0 .../Extensions/RelationalTaskExtensions.cs | 1 + .../RelationalPropertyExtensions.cs | 21 ++++++ .../RelationalForeignKeyExtensions.cs | 1 + .../Internal/RelationalIndexExtensions.cs | 2 +- .../Internal/RelationalPropertyExtensions.cs | 11 +++ ...lationalSqlTranslatingExpressionVisitor.cs | 26 +++---- .../RelationalExecutionStrategyExtensions.cs | 0 .../Update/ColumnModification.cs | 2 +- .../SqlServerDatabaseFacadeExtensions.cs | 1 + .../SqliteDatabaseFacadeExtensions.cs | 1 + ...SqliteDbContextOptionsBuilderExtensions.cs | 1 + .../SqliteServiceCollectionExtensions.cs | 0 ...ySuiteDbContextOptionsBuilderExtensions.cs | 1 + ...opologySuiteServiceCollectionExtensions.cs | 1 + .../ChangeTracking/Internal/IdentityMap.cs | 2 +- .../Diagnostics/CoreLoggerExtensions.cs | 3 +- .../EntityFrameworkQueryableExtensions.cs | 2 +- ...ityFrameworkServiceCollectionExtensions.cs | 4 +- .../Internal/EFPropertyExtensions.cs | 3 +- .../Internal/EnumerableExtensions.cs | 1 + .../Internal/ExpressionExtensions.cs | 62 +++++++++------- .../Internal/MethodInfoExtensions.cs | 2 +- .../Internal/QueryableExtensions.cs | 31 +++++++- .../Internal/TypeExtensions.cs | 31 ++++++++ .../ObservableCollectionExtensions.cs | 1 + .../Extensions/PropertyBaseExtensions.cs | 1 + .../Infrastructure/AccessorExtensions.cs | 3 +- .../Internal/AnnotatableExtensions.cs | 3 +- .../Internal/DbContextOptionsExtensions.cs | 4 +- .../Internal/InfrastructureExtensions.cs} | 7 +- .../DbContextDependenciesExtensions.cs | 1 - .../DependencyInjectionParameterBinding.cs | 4 +- .../Metadata/Internal/EntityTypeExtensions.cs | 1 + .../Metadata/Internal/ForeignKeyExtensions.cs | 1 + .../Metadata/Internal/IndexExtensions.cs | 1 + src/EFCore/Metadata/Internal/KeyExtensions.cs | 1 + .../Metadata/Internal/ModelExtensions.cs | 1 + .../Metadata/Internal/NavigationExtensions.cs | 1 + .../Metadata/Internal/PropertyExtensions.cs | 1 + .../Internal/ServicePropertyExtensions.cs | 1 + .../Internal/NullConditionalExpression.cs | 2 +- .../Internal/AsyncQueryProviderExtensions.cs | 3 +- .../Query/Internal/ExpressionPrinter.cs | 1 - .../NavigationExpansionHelpers.cs | 9 +-- .../NavigationExpansionTypeExtensions.cs | 37 ---------- .../CollectionNavigationRewritingVisitor.cs | 15 ++-- .../Visitors/IncludeApplyingVisitor.cs | 8 +-- .../Visitors/NavigationExpandingVisitor.cs | 9 ++- .../NavigationExpandingVisitor_MethodCall.cs | 72 +++++++------------ .../NavigationExpansionCleanupVisitor.cs | 1 - .../NavigationPropertyBindingVisitor.cs | 12 ++-- .../NavigationPropertyUnbindingVisitor.cs | 2 +- .../Visitors/PendingIncludeFindingVisitor.cs | 2 +- ...ntityEqualityRewritingExpressionVisitor.cs | 6 +- .../Pipeline/EntityQueryableExtensions.cs | 23 ------ .../GroupJoinFlatteningExpressionVisitor.cs | 21 +++--- .../ParameterExtractingExpressionVisitor.cs | 2 - ...yableMethodTranslatingExpressionVisitor.cs | 5 +- .../ExecutionStrategyExtensions.cs | 0 .../Extensions/SQLitePCLExtensions.cs | 1 + .../Extensions/SqliteConnectionExtensions.cs | 1 + .../Extensions/TypeExtensions.cs | 1 + .../Metadata/CosmosBuilderExtensionsTest.cs | 3 +- .../Metadata/CosmosMetadataExtensionsTest.cs | 3 +- .../TestUtilities/CosmosTestHelpers.cs | 5 -- .../Internal/IdValueGeneratorTest.cs | 1 + .../LoadTestBase.cs | 1 + .../Query/CompiledQueryTestBase.cs | 1 + .../TestModels/Northwind/NorthwindData.cs | 2 +- .../TestUtilities/EnumerableExtensions.cs | 33 +++++---- ...ppendIncludeToExistingExpressionMutator.cs | 11 +-- .../InjectStringFunctionExpressionMutator.cs | 6 +- .../StringConcatWithSelfExpressionMutator.cs | 2 +- .../TestUtilities/QueryableExtensions.cs | 33 --------- .../GraphUpdatesSqlServerTestClientCascade.cs | 2 +- ...GraphUpdatesSqlServerTestClientNoAction.cs | 2 +- .../Query/AsyncSimpleQuerySqlServerTest.cs | 2 +- ...SqlServerDesignTimeProviderServicesTest.cs | 3 +- test/EFCore.Tests/ExceptionTest.cs | 3 +- .../Extensions/PropertyExtensionsTest.cs | 3 +- .../Extensions/QueryableExtensionsTest.cs | 5 +- .../ServiceProviderExtensionsTest.cs | 3 +- 91 files changed, 300 insertions(+), 309 deletions(-) rename src/EFCore.InMemory/{Extensions => Diagnostics}/Internal/InMemoryLoggerExtensions.cs (100%) rename src/EFCore.Relational/{ => Extensions}/Internal/MethodInfoExtensions.cs (100%) create mode 100644 src/EFCore.Relational/Infrastructure/RelationalPropertyExtensions.cs rename src/EFCore.Relational/{Extensions => Storage}/RelationalExecutionStrategyExtensions.cs (100%) rename src/EFCore.Sqlite.Core/{ => Extensions}/SqliteDatabaseFacadeExtensions.cs (97%) rename src/EFCore.Sqlite.Core/{ => Extensions}/SqliteDbContextOptionsBuilderExtensions.cs (99%) rename src/EFCore.Sqlite.Core/{Infrastructure => Extensions}/SqliteServiceCollectionExtensions.cs (100%) rename src/EFCore/{ => Extensions}/EntityFrameworkQueryableExtensions.cs (99%) rename src/EFCore/{ => Extensions}/EntityFrameworkServiceCollectionExtensions.cs (99%) rename src/EFCore/{ => Extensions}/Internal/EnumerableExtensions.cs (99%) rename src/EFCore/{ => Extensions}/Internal/TypeExtensions.cs (81%) rename src/EFCore/{Metadata => Infrastructure}/Internal/AnnotatableExtensions.cs (94%) rename src/EFCore/{Extensions => Infrastructure}/Internal/DbContextOptionsExtensions.cs (92%) rename src/EFCore/{Internal/InternalAccessorExtensions.cs => Infrastructure/Internal/InfrastructureExtensions.cs} (91%) rename src/EFCore/{Extensions => }/Internal/DbContextDependenciesExtensions.cs (98%) rename src/EFCore/{Extensions => Query}/Internal/AsyncQueryProviderExtensions.cs (95%) delete mode 100644 src/EFCore/Query/NavigationExpansion/NavigationExpansionTypeExtensions.cs delete mode 100644 src/EFCore/Query/Pipeline/EntityQueryableExtensions.cs rename src/EFCore/{Extensions => Storage}/ExecutionStrategyExtensions.cs (100%) rename src/EFCore.Relational/Internal/RelationalPropertyExtensions.cs => test/EFCore.Specification.Tests/TestUtilities/EnumerableExtensions.cs (55%) delete mode 100644 test/EFCore.Specification.Tests/TestUtilities/QueryableExtensions.cs diff --git a/EFCore.sln.DotSettings b/EFCore.sln.DotSettings index c3e0c3a37e2..d16183b5637 100644 --- a/EFCore.sln.DotSettings +++ b/EFCore.sln.DotSettings @@ -189,7 +189,9 @@ Licensed under the Apache License, Version 2.0. See License.txt in the project r True True True + True True + True True True True diff --git a/src/EFCore.Cosmos/Extensions/CosmosDbContextOptionsExtensions.cs b/src/EFCore.Cosmos/Extensions/CosmosDbContextOptionsExtensions.cs index a601e17278c..100b5052fd9 100644 --- a/src/EFCore.Cosmos/Extensions/CosmosDbContextOptionsExtensions.cs +++ b/src/EFCore.Cosmos/Extensions/CosmosDbContextOptionsExtensions.cs @@ -8,6 +8,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Utilities; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { public static class CosmosDbContextOptionsExtensions diff --git a/src/EFCore.Cosmos/Extensions/CosmosLoggerExtensions.cs b/src/EFCore.Cosmos/Extensions/CosmosLoggerExtensions.cs index 3112abd445e..9818b936200 100644 --- a/src/EFCore.Cosmos/Extensions/CosmosLoggerExtensions.cs +++ b/src/EFCore.Cosmos/Extensions/CosmosLoggerExtensions.cs @@ -13,6 +13,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { public static class CosmosLoggerExtensions diff --git a/src/EFCore.Cosmos/Extensions/CosmosServiceCollectionExtensions.cs b/src/EFCore.Cosmos/Extensions/CosmosServiceCollectionExtensions.cs index 1db2e9f123d..6fa0abd8bfc 100644 --- a/src/EFCore.Cosmos/Extensions/CosmosServiceCollectionExtensions.cs +++ b/src/EFCore.Cosmos/Extensions/CosmosServiceCollectionExtensions.cs @@ -19,6 +19,7 @@ using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Utilities; +// ReSharper disable once CheckNamespace namespace Microsoft.Extensions.DependencyInjection { public static class CosmosServiceCollectionExtensions diff --git a/src/EFCore.Design/Design/Internal/DbContextOperations.cs b/src/EFCore.Design/Design/Internal/DbContextOperations.cs index 63ca474cdfa..5f339601cdd 100644 --- a/src/EFCore.Design/Design/Internal/DbContextOperations.cs +++ b/src/EFCore.Design/Design/Internal/DbContextOperations.cs @@ -8,6 +8,7 @@ using System.Reflection; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage; diff --git a/src/EFCore.InMemory/Extensions/Internal/InMemoryLoggerExtensions.cs b/src/EFCore.InMemory/Diagnostics/Internal/InMemoryLoggerExtensions.cs similarity index 100% rename from src/EFCore.InMemory/Extensions/Internal/InMemoryLoggerExtensions.cs rename to src/EFCore.InMemory/Diagnostics/Internal/InMemoryLoggerExtensions.cs diff --git a/src/EFCore.InMemory/Query/Pipeline/InMemoryProjectionBindingExpressionVisitor.cs b/src/EFCore.InMemory/Query/Pipeline/InMemoryProjectionBindingExpressionVisitor.cs index 8d7d00cae06..eb69b794a49 100644 --- a/src/EFCore.InMemory/Query/Pipeline/InMemoryProjectionBindingExpressionVisitor.cs +++ b/src/EFCore.InMemory/Query/Pipeline/InMemoryProjectionBindingExpressionVisitor.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query.Pipeline; using Microsoft.EntityFrameworkCore.Storage; diff --git a/src/EFCore.InMemory/Query/Pipeline/Translator.cs b/src/EFCore.InMemory/Query/Pipeline/Translator.cs index 6fe1d97dcb1..aa17f646615 100644 --- a/src/EFCore.InMemory/Query/Pipeline/Translator.cs +++ b/src/EFCore.InMemory/Query/Pipeline/Translator.cs @@ -4,7 +4,7 @@ using System; using System.Linq.Expressions; using System.Reflection; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.Query.Expressions.Internal; using Microsoft.EntityFrameworkCore.Query.Internal; diff --git a/src/EFCore.Relational/Internal/MethodInfoExtensions.cs b/src/EFCore.Relational/Extensions/Internal/MethodInfoExtensions.cs similarity index 100% rename from src/EFCore.Relational/Internal/MethodInfoExtensions.cs rename to src/EFCore.Relational/Extensions/Internal/MethodInfoExtensions.cs diff --git a/src/EFCore.Relational/Extensions/RelationalTaskExtensions.cs b/src/EFCore.Relational/Extensions/RelationalTaskExtensions.cs index d68c819f7b6..614e6d43e20 100644 --- a/src/EFCore.Relational/Extensions/RelationalTaskExtensions.cs +++ b/src/EFCore.Relational/Extensions/RelationalTaskExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// ReSharper disable once CheckNamespace namespace System.Threading.Tasks { internal static class RelationalTaskExtensions diff --git a/src/EFCore.Relational/Infrastructure/RelationalPropertyExtensions.cs b/src/EFCore.Relational/Infrastructure/RelationalPropertyExtensions.cs new file mode 100644 index 00000000000..a73098a9efa --- /dev/null +++ b/src/EFCore.Relational/Infrastructure/RelationalPropertyExtensions.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore.Metadata; + +namespace Microsoft.EntityFrameworkCore.Infrastructure +{ + public static class RelationalPropertyExtensions + { + /// + /// Creates a comma-separated list of property names. + /// + /// The properties to format. + /// A comma-separated list of property names. + public static string FormatColumns([NotNull] this IEnumerable properties) + => "{" + string.Join(", ", properties.Select(p => "'" + p.GetColumnName() + "'")) + "}"; + } +} diff --git a/src/EFCore.Relational/Metadata/Internal/RelationalForeignKeyExtensions.cs b/src/EFCore.Relational/Metadata/Internal/RelationalForeignKeyExtensions.cs index c5a34e054ae..abf3aa04de4 100644 --- a/src/EFCore.Relational/Metadata/Internal/RelationalForeignKeyExtensions.cs +++ b/src/EFCore.Relational/Metadata/Internal/RelationalForeignKeyExtensions.cs @@ -5,6 +5,7 @@ using System.Linq; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.Metadata.Internal diff --git a/src/EFCore.Relational/Metadata/Internal/RelationalIndexExtensions.cs b/src/EFCore.Relational/Metadata/Internal/RelationalIndexExtensions.cs index d929cbd0c63..f950bae8385 100644 --- a/src/EFCore.Relational/Metadata/Internal/RelationalIndexExtensions.cs +++ b/src/EFCore.Relational/Metadata/Internal/RelationalIndexExtensions.cs @@ -5,7 +5,7 @@ using System.Linq; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Internal; +using Microsoft.EntityFrameworkCore.Infrastructure; namespace Microsoft.EntityFrameworkCore.Metadata.Internal { diff --git a/src/EFCore.Relational/Metadata/Internal/RelationalPropertyExtensions.cs b/src/EFCore.Relational/Metadata/Internal/RelationalPropertyExtensions.cs index dbdf7325e8a..0ee7d749dbd 100644 --- a/src/EFCore.Relational/Metadata/Internal/RelationalPropertyExtensions.cs +++ b/src/EFCore.Relational/Metadata/Internal/RelationalPropertyExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Diagnostics; using JetBrains.Annotations; namespace Microsoft.EntityFrameworkCore.Metadata.Internal @@ -48,5 +49,15 @@ public static IForeignKey FindSharedTableLink([NotNull] this IProperty property) return null; } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + [DebuggerStepThrough] + public static string GetConfiguredColumnType([NotNull] this IProperty property) + => (string)property[RelationalAnnotationNames.ColumnType]; } } diff --git a/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs b/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs index 8afa0d65f6d..e190ae4e741 100644 --- a/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs +++ b/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs @@ -2,13 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Reflection; -using System.Runtime.InteropServices.ComTypes; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Query.Expressions.Internal; @@ -157,10 +155,8 @@ protected override Expression VisitTypeBinary(TypeBinaryExpression typeBinaryExp _sqlExpressionFactory.Constant(concreteEntityTypes.Select(et => et.GetDiscriminatorValue()).ToList()), negated: false); } - else - { - return _sqlExpressionFactory.Constant(false); - } + + return _sqlExpressionFactory.Constant(false); } return null; @@ -189,15 +185,11 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp { return subquery.Projection[0].Expression; } - else - { - throw new InvalidOperationException(); - } - } - else - { - return new SubSelectExpression(subquery); + + throw new InvalidOperationException(); } + + return new SubSelectExpression(subquery); } var @object = Visit(methodCallExpression.Object); @@ -393,8 +385,6 @@ protected override Expression VisitUnary(UnaryExpression unaryExpression) [DebuggerStepThrough] private bool TranslationFailed(Expression original, Expression translation) - { - return original == null ? false : !(translation is SqlExpression); - } + => original != null && !(translation is SqlExpression); } } diff --git a/src/EFCore.Relational/Extensions/RelationalExecutionStrategyExtensions.cs b/src/EFCore.Relational/Storage/RelationalExecutionStrategyExtensions.cs similarity index 100% rename from src/EFCore.Relational/Extensions/RelationalExecutionStrategyExtensions.cs rename to src/EFCore.Relational/Storage/RelationalExecutionStrategyExtensions.cs diff --git a/src/EFCore.Relational/Update/ColumnModification.cs b/src/EFCore.Relational/Update/ColumnModification.cs index f07ee466f6b..0c560c28fab 100644 --- a/src/EFCore.Relational/Update/ColumnModification.cs +++ b/src/EFCore.Relational/Update/ColumnModification.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Internal; +using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Utilities; diff --git a/src/EFCore.SqlServer/Extensions/SqlServerDatabaseFacadeExtensions.cs b/src/EFCore.SqlServer/Extensions/SqlServerDatabaseFacadeExtensions.cs index 44f0fd0be52..967a77926ed 100644 --- a/src/EFCore.SqlServer/Extensions/SqlServerDatabaseFacadeExtensions.cs +++ b/src/EFCore.SqlServer/Extensions/SqlServerDatabaseFacadeExtensions.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.SqlServer.Infrastructure.Internal; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { /// diff --git a/src/EFCore.Sqlite.Core/SqliteDatabaseFacadeExtensions.cs b/src/EFCore.Sqlite.Core/Extensions/SqliteDatabaseFacadeExtensions.cs similarity index 97% rename from src/EFCore.Sqlite.Core/SqliteDatabaseFacadeExtensions.cs rename to src/EFCore.Sqlite.Core/Extensions/SqliteDatabaseFacadeExtensions.cs index da89e6e1897..e3f937aa31c 100644 --- a/src/EFCore.Sqlite.Core/SqliteDatabaseFacadeExtensions.cs +++ b/src/EFCore.Sqlite.Core/Extensions/SqliteDatabaseFacadeExtensions.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Sqlite.Infrastructure.Internal; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { /// diff --git a/src/EFCore.Sqlite.Core/SqliteDbContextOptionsBuilderExtensions.cs b/src/EFCore.Sqlite.Core/Extensions/SqliteDbContextOptionsBuilderExtensions.cs similarity index 99% rename from src/EFCore.Sqlite.Core/SqliteDbContextOptionsBuilderExtensions.cs rename to src/EFCore.Sqlite.Core/Extensions/SqliteDbContextOptionsBuilderExtensions.cs index b20cba55620..7351b3b388d 100644 --- a/src/EFCore.Sqlite.Core/SqliteDbContextOptionsBuilderExtensions.cs +++ b/src/EFCore.Sqlite.Core/Extensions/SqliteDbContextOptionsBuilderExtensions.cs @@ -9,6 +9,7 @@ using Microsoft.EntityFrameworkCore.Sqlite.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.Utilities; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { /// diff --git a/src/EFCore.Sqlite.Core/Infrastructure/SqliteServiceCollectionExtensions.cs b/src/EFCore.Sqlite.Core/Extensions/SqliteServiceCollectionExtensions.cs similarity index 100% rename from src/EFCore.Sqlite.Core/Infrastructure/SqliteServiceCollectionExtensions.cs rename to src/EFCore.Sqlite.Core/Extensions/SqliteServiceCollectionExtensions.cs diff --git a/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteDbContextOptionsBuilderExtensions.cs b/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteDbContextOptionsBuilderExtensions.cs index e9542fb49fa..4bf5201a72a 100644 --- a/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteDbContextOptionsBuilderExtensions.cs +++ b/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteDbContextOptionsBuilderExtensions.cs @@ -6,6 +6,7 @@ using Microsoft.EntityFrameworkCore.Sqlite.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.Utilities; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { /// diff --git a/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteServiceCollectionExtensions.cs b/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteServiceCollectionExtensions.cs index ed9ee3cd85a..64011ac7006 100644 --- a/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteServiceCollectionExtensions.cs +++ b/src/EFCore.Sqlite.NTS/Extensions/SqliteNetTopologySuiteServiceCollectionExtensions.cs @@ -11,6 +11,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using NetTopologySuite; +// ReSharper disable once CheckNamespace namespace Microsoft.Extensions.DependencyInjection { /// diff --git a/src/EFCore/ChangeTracking/Internal/IdentityMap.cs b/src/EFCore/ChangeTracking/Internal/IdentityMap.cs index 0811bf53c74..f1978bcda7e 100644 --- a/src/EFCore/ChangeTracking/Internal/IdentityMap.cs +++ b/src/EFCore/ChangeTracking/Internal/IdentityMap.cs @@ -47,7 +47,7 @@ public IdentityMap( { _foreignKeys = key.DeclaringEntityType .GetDerivedTypesInclusive() - .SelectMany(e => e.GetDeclaredForeignKeys()) + .SelectMany(EntityTypeExtensions.GetDeclaredForeignKeys) .ToArray(); } } diff --git a/src/EFCore/Diagnostics/CoreLoggerExtensions.cs b/src/EFCore/Diagnostics/CoreLoggerExtensions.cs index 796c8951569..c2fefbedcfd 100644 --- a/src/EFCore/Diagnostics/CoreLoggerExtensions.cs +++ b/src/EFCore/Diagnostics/CoreLoggerExtensions.cs @@ -12,6 +12,7 @@ using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; using Microsoft.EntityFrameworkCore.Diagnostics.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata.Internal; @@ -34,8 +35,6 @@ namespace Microsoft.EntityFrameworkCore.Diagnostics /// public static class CoreLoggerExtensions { - private const int QueryModelStringLengthLimit = 100; - /// /// Logs for the event. /// diff --git a/src/EFCore/EntityFrameworkQueryableExtensions.cs b/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs similarity index 99% rename from src/EFCore/EntityFrameworkQueryableExtensions.cs rename to src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs index aa007437677..aea194ed028 100644 --- a/src/EFCore/EntityFrameworkQueryableExtensions.cs +++ b/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs @@ -12,7 +12,7 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.Query.Internal; using Microsoft.EntityFrameworkCore.Utilities; diff --git a/src/EFCore/EntityFrameworkServiceCollectionExtensions.cs b/src/EFCore/Extensions/EntityFrameworkServiceCollectionExtensions.cs similarity index 99% rename from src/EFCore/EntityFrameworkServiceCollectionExtensions.cs rename to src/EFCore/Extensions/EntityFrameworkServiceCollectionExtensions.cs index 96bf857ff8d..80f01cebb7d 100644 --- a/src/EFCore/EntityFrameworkServiceCollectionExtensions.cs +++ b/src/EFCore/Extensions/EntityFrameworkServiceCollectionExtensions.cs @@ -116,7 +116,7 @@ public static IServiceCollection AddDbContext)null - : (p, b) => optionsAction?.Invoke(b), contextLifetime, optionsLifetime); + : (p, b) => optionsAction.Invoke(b), contextLifetime, optionsLifetime); /// /// Registers the given context as a service in the and enables DbContext pooling. @@ -219,7 +219,7 @@ public static IServiceCollection AddDbContextPool( [NotNull] Action optionsAction, int poolSize = 128) where TContext : DbContext - => AddDbContextPool(serviceCollection, optionsAction); + => AddDbContextPool(serviceCollection, optionsAction, poolSize); /// /// diff --git a/src/EFCore/Extensions/Internal/EFPropertyExtensions.cs b/src/EFCore/Extensions/Internal/EFPropertyExtensions.cs index 3d8aaa3e710..12d29566e18 100644 --- a/src/EFCore/Extensions/Internal/EFPropertyExtensions.cs +++ b/src/EFCore/Extensions/Internal/EFPropertyExtensions.cs @@ -9,7 +9,8 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata; -namespace Microsoft.EntityFrameworkCore.Extensions.Internal +// ReSharper disable once CheckNamespace +namespace Microsoft.EntityFrameworkCore.Internal { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore/Internal/EnumerableExtensions.cs b/src/EFCore/Extensions/Internal/EnumerableExtensions.cs similarity index 99% rename from src/EFCore/Internal/EnumerableExtensions.cs rename to src/EFCore/Extensions/Internal/EnumerableExtensions.cs index bfadd03516f..aacede2d6fc 100644 --- a/src/EFCore/Internal/EnumerableExtensions.cs +++ b/src/EFCore/Extensions/Internal/EnumerableExtensions.cs @@ -8,6 +8,7 @@ using System.Linq; using JetBrains.Annotations; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore.Internal { /// diff --git a/src/EFCore/Extensions/Internal/ExpressionExtensions.cs b/src/EFCore/Extensions/Internal/ExpressionExtensions.cs index 8d9902764af..8acc4c7aa2a 100644 --- a/src/EFCore/Extensions/Internal/ExpressionExtensions.cs +++ b/src/EFCore/Extensions/Internal/ExpressionExtensions.cs @@ -332,25 +332,12 @@ public static Expression Assign( if (memberExpression.Member is FieldInfo fieldInfo && fieldInfo.IsInitOnly) { - if (new FrameworkName(AppContext.TargetFrameworkName).Identifier == ".NETCoreApp") - { - return (BinaryExpression)Activator.CreateInstance( - _assignBinaryExpressionType, - BindingFlags.NonPublic | BindingFlags.Instance, - null, - new object[] { memberExpression, valueExpression }, - null); - } - - // On .NET Framework the compiler refuses to compile an expression tree with IsInitOnly access, - // so use Reflection's SetValue instead. - return Expression.Call( - Expression.Constant(fieldInfo), - _fieldInfoSetValueMethod, - memberExpression.Expression, - Expression.Convert( - valueExpression, - typeof(object))); + return (BinaryExpression)Activator.CreateInstance( + _assignBinaryExpressionType, + BindingFlags.NonPublic | BindingFlags.Instance, + null, + new object[] { memberExpression, valueExpression }, + null); } return Expression.Assign(memberExpression, valueExpression); @@ -359,9 +346,12 @@ public static Expression Assign( private static readonly Type _assignBinaryExpressionType = typeof(Expression).Assembly.GetType("System.Linq.Expressions.AssignBinaryExpression"); - private static readonly MethodInfo _fieldInfoSetValueMethod - = typeof(FieldInfo).GetRuntimeMethod(nameof(FieldInfo.SetValue), new[] { typeof(object), typeof(object) }); - + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// public static LambdaExpression GetLambdaOrNull(this Expression expression) => expression is LambdaExpression lambda ? lambda @@ -369,15 +359,33 @@ public static LambdaExpression GetLambdaOrNull(this Expression expression) ? (LambdaExpression)unary.Operand : null; + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// public static LambdaExpression UnwrapQuote(this Expression expression) => expression is UnaryExpression unary && expression.NodeType == ExpressionType.Quote ? (LambdaExpression)unary.Operand : (LambdaExpression)expression; + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// public static bool IsIncludeMethod(this MethodCallExpression methodCallExpression) => methodCallExpression.Method.DeclaringType == typeof(EntityFrameworkQueryableExtensions) && methodCallExpression.Method.Name == nameof(EntityFrameworkQueryableExtensions.Include); + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// public static Expression BuildPropertyAccess(this Expression root, List path) { var result = root; @@ -389,13 +397,19 @@ public static Expression BuildPropertyAccess(this Expression root, List return result; } + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// public static Expression CombineAndRemap( - Expression source, + this Expression source, ParameterExpression sourceParameter, Expression replaceWith) => new ExpressionCombiningVisitor(sourceParameter, replaceWith).Visit(source); - public class ExpressionCombiningVisitor : ExpressionVisitor + private class ExpressionCombiningVisitor : ExpressionVisitor { private ParameterExpression _sourceParameter; private Expression _replaceWith; diff --git a/src/EFCore/Extensions/Internal/MethodInfoExtensions.cs b/src/EFCore/Extensions/Internal/MethodInfoExtensions.cs index c798eba27f0..aa331ec133c 100644 --- a/src/EFCore/Extensions/Internal/MethodInfoExtensions.cs +++ b/src/EFCore/Extensions/Internal/MethodInfoExtensions.cs @@ -6,7 +6,7 @@ using JetBrains.Annotations; // ReSharper disable once CheckNamespace -namespace Microsoft.EntityFrameworkCore.Extensions.Internal +namespace Microsoft.EntityFrameworkCore.Internal { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore/Extensions/Internal/QueryableExtensions.cs b/src/EFCore/Extensions/Internal/QueryableExtensions.cs index 7dab0fdaca6..6673326b5f3 100644 --- a/src/EFCore/Extensions/Internal/QueryableExtensions.cs +++ b/src/EFCore/Extensions/Internal/QueryableExtensions.cs @@ -4,12 +4,16 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Query.Internal; using Microsoft.EntityFrameworkCore.Utilities; -namespace Microsoft.EntityFrameworkCore.Extensions.Internal +// ReSharper disable CheckNamespace +namespace Microsoft.EntityFrameworkCore.Internal { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -42,5 +46,30 @@ public static IAsyncEnumerable AsAsyncEnumerable( throw new InvalidOperationException(CoreStrings.IQueryableNotAsync(typeof(TSource))); } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public static IQueryable LeftJoin( + this IQueryable outer, + IEnumerable inner, + Expression> outerKeySelector, + Expression> innerKeySelector, + Expression> resultSelector) + { + throw new NotImplementedException(); + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public static Task> ToListAsync(this IQueryable source, CancellationToken cancellationToken = default) + => ((IQueryable)source).ToListAsync(cancellationToken); } } diff --git a/src/EFCore/Internal/TypeExtensions.cs b/src/EFCore/Extensions/Internal/TypeExtensions.cs similarity index 81% rename from src/EFCore/Internal/TypeExtensions.cs rename to src/EFCore/Extensions/Internal/TypeExtensions.cs index 2f04d2cf0b5..f4b24e93679 100644 --- a/src/EFCore/Internal/TypeExtensions.cs +++ b/src/EFCore/Extensions/Internal/TypeExtensions.cs @@ -8,6 +8,7 @@ using System.Text; using JetBrains.Annotations; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore.Internal { /// @@ -181,5 +182,35 @@ public static IEnumerable GetNamespaces([NotNull] this Type type) } } } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public static string GenerateParameterName(this Type type) + { + var sb = new StringBuilder(); + var removeLowerCase = sb.Append(type.Name.Where(char.IsUpper).ToArray()).ToString(); + + return removeLowerCase.Length > 0 ? removeLowerCase.ToLower() : type.Name.ToLower().Substring(0, 1); + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public static bool IsQueryableType(this Type type) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IQueryable<>)) + { + return true; + } + + return type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IQueryable<>)); + } } } diff --git a/src/EFCore/Extensions/ObservableCollectionExtensions.cs b/src/EFCore/Extensions/ObservableCollectionExtensions.cs index 1c263659152..9f61c1ecc87 100644 --- a/src/EFCore/Extensions/ObservableCollectionExtensions.cs +++ b/src/EFCore/Extensions/ObservableCollectionExtensions.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; using Microsoft.EntityFrameworkCore.Utilities; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { /// diff --git a/src/EFCore/Extensions/PropertyBaseExtensions.cs b/src/EFCore/Extensions/PropertyBaseExtensions.cs index 0fbaaf82889..f3422da5ad1 100644 --- a/src/EFCore/Extensions/PropertyBaseExtensions.cs +++ b/src/EFCore/Extensions/PropertyBaseExtensions.cs @@ -8,6 +8,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Utilities; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore { /// diff --git a/src/EFCore/Infrastructure/AccessorExtensions.cs b/src/EFCore/Infrastructure/AccessorExtensions.cs index ecc4e0e9817..127234974f9 100644 --- a/src/EFCore/Infrastructure/AccessorExtensions.cs +++ b/src/EFCore/Infrastructure/AccessorExtensions.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Utilities; @@ -43,7 +44,7 @@ public static class AccessorExtensions /// The requested service. [DebuggerStepThrough] public static TService GetService([NotNull] this IInfrastructure accessor) - => InternalAccessorExtensions.GetService(Check.NotNull(accessor, nameof(accessor))); + => InfrastructureExtensions.GetService(Check.NotNull(accessor, nameof(accessor))); /// /// diff --git a/src/EFCore/Metadata/Internal/AnnotatableExtensions.cs b/src/EFCore/Infrastructure/Internal/AnnotatableExtensions.cs similarity index 94% rename from src/EFCore/Metadata/Internal/AnnotatableExtensions.cs rename to src/EFCore/Infrastructure/Internal/AnnotatableExtensions.cs index 8bae06274ab..2f5980a2c08 100644 --- a/src/EFCore/Metadata/Internal/AnnotatableExtensions.cs +++ b/src/EFCore/Infrastructure/Internal/AnnotatableExtensions.cs @@ -4,9 +4,8 @@ using System.Linq; using System.Text; using JetBrains.Annotations; -using Microsoft.EntityFrameworkCore.Infrastructure; -namespace Microsoft.EntityFrameworkCore.Metadata.Internal +namespace Microsoft.EntityFrameworkCore.Infrastructure.Internal { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore/Extensions/Internal/DbContextOptionsExtensions.cs b/src/EFCore/Infrastructure/Internal/DbContextOptionsExtensions.cs similarity index 92% rename from src/EFCore/Extensions/Internal/DbContextOptionsExtensions.cs rename to src/EFCore/Infrastructure/Internal/DbContextOptionsExtensions.cs index 26eba5c506f..919a82657b2 100644 --- a/src/EFCore/Extensions/Internal/DbContextOptionsExtensions.cs +++ b/src/EFCore/Infrastructure/Internal/DbContextOptionsExtensions.cs @@ -3,10 +3,8 @@ using System.Text; using JetBrains.Annotations; -using Microsoft.EntityFrameworkCore.Infrastructure; -// ReSharper disable once CheckNamespace -namespace Microsoft.EntityFrameworkCore.Internal +namespace Microsoft.EntityFrameworkCore.Infrastructure.Internal { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore/Internal/InternalAccessorExtensions.cs b/src/EFCore/Infrastructure/Internal/InfrastructureExtensions.cs similarity index 91% rename from src/EFCore/Internal/InternalAccessorExtensions.cs rename to src/EFCore/Infrastructure/Internal/InfrastructureExtensions.cs index aa20808c800..4f34a3e5276 100644 --- a/src/EFCore/Internal/InternalAccessorExtensions.cs +++ b/src/EFCore/Infrastructure/Internal/InfrastructureExtensions.cs @@ -5,10 +5,11 @@ using System.Linq; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.EntityFrameworkCore.Internal +// ReSharper disable once CheckNamespace +namespace Microsoft.EntityFrameworkCore.Infrastructure.Internal { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -16,7 +17,7 @@ namespace Microsoft.EntityFrameworkCore.Internal /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public static class InternalAccessorExtensions + public static class InfrastructureExtensions { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore/Extensions/Internal/DbContextDependenciesExtensions.cs b/src/EFCore/Internal/DbContextDependenciesExtensions.cs similarity index 98% rename from src/EFCore/Extensions/Internal/DbContextDependenciesExtensions.cs rename to src/EFCore/Internal/DbContextDependenciesExtensions.cs index 4fbead42cc4..2fb0eaacefe 100644 --- a/src/EFCore/Extensions/Internal/DbContextDependenciesExtensions.cs +++ b/src/EFCore/Internal/DbContextDependenciesExtensions.cs @@ -5,7 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore.Internal { /// diff --git a/src/EFCore/Metadata/DependencyInjectionParameterBinding.cs b/src/EFCore/Metadata/DependencyInjectionParameterBinding.cs index 264bed84e16..1eedd2e9225 100644 --- a/src/EFCore/Metadata/DependencyInjectionParameterBinding.cs +++ b/src/EFCore/Metadata/DependencyInjectionParameterBinding.cs @@ -6,7 +6,7 @@ using System.Reflection; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Internal; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Utilities; @@ -20,7 +20,7 @@ namespace Microsoft.EntityFrameworkCore.Metadata public class DependencyInjectionParameterBinding : ServiceParameterBinding { private static readonly MethodInfo _getServiceMethod - = typeof(InternalAccessorExtensions).GetMethod(nameof(InternalAccessorExtensions.GetService)); + = typeof(InfrastructureExtensions).GetMethod(nameof(InfrastructureExtensions.GetService)); /// /// Creates a new instance for the given service type. diff --git a/src/EFCore/Metadata/Internal/EntityTypeExtensions.cs b/src/EFCore/Metadata/Internal/EntityTypeExtensions.cs index deb6506308a..d7656aea2a9 100644 --- a/src/EFCore/Metadata/Internal/EntityTypeExtensions.cs +++ b/src/EFCore/Metadata/Internal/EntityTypeExtensions.cs @@ -12,6 +12,7 @@ using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.Utilities; // ReSharper disable ArgumentsStyleOther diff --git a/src/EFCore/Metadata/Internal/ForeignKeyExtensions.cs b/src/EFCore/Metadata/Internal/ForeignKeyExtensions.cs index 07cc690521d..12c020f2f99 100644 --- a/src/EFCore/Metadata/Internal/ForeignKeyExtensions.cs +++ b/src/EFCore/Metadata/Internal/ForeignKeyExtensions.cs @@ -8,6 +8,7 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; namespace Microsoft.EntityFrameworkCore.Metadata.Internal { diff --git a/src/EFCore/Metadata/Internal/IndexExtensions.cs b/src/EFCore/Metadata/Internal/IndexExtensions.cs index 09b65652912..01a6ecc56f8 100644 --- a/src/EFCore/Metadata/Internal/IndexExtensions.cs +++ b/src/EFCore/Metadata/Internal/IndexExtensions.cs @@ -6,6 +6,7 @@ using System.Text; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; namespace Microsoft.EntityFrameworkCore.Metadata.Internal { diff --git a/src/EFCore/Metadata/Internal/KeyExtensions.cs b/src/EFCore/Metadata/Internal/KeyExtensions.cs index cca6bf804d5..d0e50f272c3 100644 --- a/src/EFCore/Metadata/Internal/KeyExtensions.cs +++ b/src/EFCore/Metadata/Internal/KeyExtensions.cs @@ -7,6 +7,7 @@ using System.Text; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; namespace Microsoft.EntityFrameworkCore.Metadata.Internal { diff --git a/src/EFCore/Metadata/Internal/ModelExtensions.cs b/src/EFCore/Metadata/Internal/ModelExtensions.cs index 533a1ceb990..addd4e0b9ae 100644 --- a/src/EFCore/Metadata/Internal/ModelExtensions.cs +++ b/src/EFCore/Metadata/Internal/ModelExtensions.cs @@ -6,6 +6,7 @@ using System.Runtime.CompilerServices; using System.Text; using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; namespace Microsoft.EntityFrameworkCore.Metadata.Internal { diff --git a/src/EFCore/Metadata/Internal/NavigationExtensions.cs b/src/EFCore/Metadata/Internal/NavigationExtensions.cs index 2347d6bc3f6..8fd6422b747 100644 --- a/src/EFCore/Metadata/Internal/NavigationExtensions.cs +++ b/src/EFCore/Metadata/Internal/NavigationExtensions.cs @@ -5,6 +5,7 @@ using System.Text; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; namespace Microsoft.EntityFrameworkCore.Metadata.Internal { diff --git a/src/EFCore/Metadata/Internal/PropertyExtensions.cs b/src/EFCore/Metadata/Internal/PropertyExtensions.cs index 4b6509f8f48..d789588078f 100644 --- a/src/EFCore/Metadata/Internal/PropertyExtensions.cs +++ b/src/EFCore/Metadata/Internal/PropertyExtensions.cs @@ -8,6 +8,7 @@ using System.Text; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; using Microsoft.EntityFrameworkCore.ValueGeneration; namespace Microsoft.EntityFrameworkCore.Metadata.Internal diff --git a/src/EFCore/Metadata/Internal/ServicePropertyExtensions.cs b/src/EFCore/Metadata/Internal/ServicePropertyExtensions.cs index 32af5e97670..1595b8d8f21 100644 --- a/src/EFCore/Metadata/Internal/ServicePropertyExtensions.cs +++ b/src/EFCore/Metadata/Internal/ServicePropertyExtensions.cs @@ -5,6 +5,7 @@ using System.Text; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; namespace Microsoft.EntityFrameworkCore.Metadata.Internal { diff --git a/src/EFCore/Query/Expressions/Internal/NullConditionalExpression.cs b/src/EFCore/Query/Expressions/Internal/NullConditionalExpression.cs index 6f6579f8194..b91f4960551 100644 --- a/src/EFCore/Query/Expressions/Internal/NullConditionalExpression.cs +++ b/src/EFCore/Query/Expressions/Internal/NullConditionalExpression.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Linq.Expressions; using JetBrains.Annotations; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query.Internal; using Microsoft.EntityFrameworkCore.Query.Pipeline; using Microsoft.EntityFrameworkCore.Utilities; diff --git a/src/EFCore/Extensions/Internal/AsyncQueryProviderExtensions.cs b/src/EFCore/Query/Internal/AsyncQueryProviderExtensions.cs similarity index 95% rename from src/EFCore/Extensions/Internal/AsyncQueryProviderExtensions.cs rename to src/EFCore/Query/Internal/AsyncQueryProviderExtensions.cs index 40ab4afe833..28531cbed5d 100644 --- a/src/EFCore/Extensions/Internal/AsyncQueryProviderExtensions.cs +++ b/src/EFCore/Query/Internal/AsyncQueryProviderExtensions.cs @@ -5,10 +5,9 @@ using System.Linq.Expressions; using System.Reflection; using JetBrains.Annotations; -using Microsoft.EntityFrameworkCore.Query.Internal; using Microsoft.EntityFrameworkCore.Utilities; -namespace Microsoft.EntityFrameworkCore.Extensions.Internal +namespace Microsoft.EntityFrameworkCore.Query.Internal { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore/Query/Internal/ExpressionPrinter.cs b/src/EFCore/Query/Internal/ExpressionPrinter.cs index 814e7c8884e..cd9edcb4149 100644 --- a/src/EFCore/Query/Internal/ExpressionPrinter.cs +++ b/src/EFCore/Query/Internal/ExpressionPrinter.cs @@ -9,7 +9,6 @@ using System.Reflection; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata.Internal; diff --git a/src/EFCore/Query/NavigationExpansion/NavigationExpansionHelpers.cs b/src/EFCore/Query/NavigationExpansion/NavigationExpansionHelpers.cs index ea9d6d99c08..14552be1632 100644 --- a/src/EFCore/Query/NavigationExpansion/NavigationExpansionHelpers.cs +++ b/src/EFCore/Query/NavigationExpansion/NavigationExpansionHelpers.cs @@ -6,13 +6,11 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Query.Expressions.Internal; using Microsoft.EntityFrameworkCore.Query.Internal; -using Microsoft.EntityFrameworkCore.Query.Pipeline; namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion { @@ -57,8 +55,8 @@ public static NavigationExpansionExpression CreateNavigationExpansionRoot( materializeCollectionNavigation?.ClrType ?? operand.Type); } - private static MethodInfo _leftJoinMethodInfo = typeof(EntityQueryableExtensions).GetTypeInfo() - .GetDeclaredMethods(nameof(EntityQueryableExtensions.LeftJoin)).Single(mi => mi.GetParameters().Length == 5); + private static readonly MethodInfo _leftJoinMethodInfo = typeof(QueryableExtensions).GetTypeInfo() + .GetDeclaredMethods(nameof(QueryableExtensions.LeftJoin)).Single(mi => mi.GetParameters().Length == 5); public static (Expression source, ParameterExpression parameter) AddNavigationJoin( Expression sourceExpression, @@ -123,8 +121,6 @@ public static (Expression source, ParameterExpression parameter) AddNavigationJo innerKeySelectorBody, innerKeySelectorParameter); - var oldParameterExpression = parameterExpression; - if (!sourceExpression.Type.IsQueryableType()) { var asQueryableMethodInfo = LinqMethodHelpers.AsQueryable.MakeGenericMethod(sourceType); @@ -171,7 +167,6 @@ var transparentIdentifierCtorInfo innerKeySelector, resultSelector); - sourceType = resultSelector.ReturnType; sourceExpression = joinMethodCall; var transparentIdentifierParameterName = resultSelectorInnerParameterName; diff --git a/src/EFCore/Query/NavigationExpansion/NavigationExpansionTypeExtensions.cs b/src/EFCore/Query/NavigationExpansion/NavigationExpansionTypeExtensions.cs deleted file mode 100644 index d34f1a622d5..00000000000 --- a/src/EFCore/Query/NavigationExpansion/NavigationExpansionTypeExtensions.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using System.Text; - -namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion -{ - public static class NavigationExpansionTypeExtensions - { - public static string GenerateParameterName(this Type type) - { - var sb = new StringBuilder(); - var removeLowerCase = sb.Append(type.Name.Where(c => char.IsUpper(c)).ToArray()).ToString(); - - if (removeLowerCase.Length > 0) - { - return removeLowerCase.ToLower(); - } - else - { - return type.Name.ToLower().Substring(0, 1); - } - } - - public static bool IsQueryableType(this Type type) - { - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IQueryable<>)) - { - return true; - } - - return type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IQueryable<>)); - } - } -} diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/CollectionNavigationRewritingVisitor.cs b/src/EFCore/Query/NavigationExpansion/Visitors/CollectionNavigationRewritingVisitor.cs index 9f3f0d236cb..4468642b436 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/CollectionNavigationRewritingVisitor.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/CollectionNavigationRewritingVisitor.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.Linq; using System.Linq.Expressions; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Query.Internal; @@ -19,7 +18,7 @@ namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion.Visitors /// public class CollectionNavigationRewritingVisitor : ExpressionVisitor { - private ParameterExpression _sourceParameter; + private readonly ParameterExpression _sourceParameter; public CollectionNavigationRewritingVisitor(ParameterExpression sourceParameter) { @@ -221,10 +220,8 @@ protected override Expression VisitMember(MemberExpression memberExpression) return result; } - else - { - return memberExpression.Update(newExpression); - } + + return memberExpression.Update(newExpression); } return memberExpression; @@ -233,7 +230,7 @@ protected override Expression VisitMember(MemberExpression memberExpression) private static Expression CreateKeyComparisonExpressionForCollectionNavigationSubquery( Expression outerKeyExpression, Expression innerKeyExpression, - Expression colectionRootExpression) + Expression collectionRootExpression) { if (outerKeyExpression.Type != innerKeyExpression.Type) { @@ -254,8 +251,8 @@ private static Expression CreateKeyComparisonExpressionForCollectionNavigationSu var outerNullProtection = Expression.NotEqual( - colectionRootExpression, - Expression.Constant(null, colectionRootExpression.Type)); + collectionRootExpression, + Expression.Constant(null, collectionRootExpression.Type)); return new CorrelationPredicateExpression( outerNullProtection, diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/IncludeApplyingVisitor.cs b/src/EFCore/Query/NavigationExpansion/Visitors/IncludeApplyingVisitor.cs index 50e51e4de0a..318d123d207 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/IncludeApplyingVisitor.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/IncludeApplyingVisitor.cs @@ -1,12 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Linq; +using System.Linq.Expressions; +using Microsoft.EntityFrameworkCore.Internal; + namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion.Visitors { - using System.Linq; - using System.Linq.Expressions; - using Microsoft.EntityFrameworkCore.Extensions.Internal; - public class PendingSelectorIncludeRewriter : ExpressionVisitor { protected override Expression VisitMember(MemberExpression memberExpression) => memberExpression; diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor.cs b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor.cs index 5726fd02e9e..d03d9f7164f 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Query.Internal; @@ -108,7 +107,7 @@ private Expression ProcessMemberPushdown( } var selector = Expression.Lambda(selectorBody, selectorParameter); - var remappedSelectorBody = ExpressionExtensions.CombineAndRemap(selector.Body, selectorParameter, navigationExpansionExpression.State.PendingSelector.Body); + var remappedSelectorBody = selector.Body.CombineAndRemap(selectorParameter, navigationExpansionExpression.State.PendingSelector.Body); var binder = new NavigationPropertyBindingVisitor( navigationExpansionExpression.State.CurrentParameter, @@ -136,7 +135,7 @@ private Expression ProcessMemberPushdown( lastNavigation.ForeignKey.PrincipalKey.Properties), innerParameter); - var combinedKeySelectorBody = ExpressionExtensions.CombineAndRemap(innerKeyAccessLambda.Body, innerKeyAccessLambda.Parameters[0], navigationExpansionExpression.State.PendingSelector.Body); + var combinedKeySelectorBody = innerKeyAccessLambda.Body.CombineAndRemap(innerKeyAccessLambda.Parameters[0], navigationExpansionExpression.State.PendingSelector.Body); if (outerKeyAccess.Type != combinedKeySelectorBody.Type) { if (combinedKeySelectorBody.Type.IsNullableType()) @@ -230,7 +229,7 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression) var rightConstantNull = binaryExpression.Right.IsNullConstantExpression(); // collection comparison must be optimized out before we visit the left and right - // otherwise collections would be rewriteen and harder to identify + // otherwise collections would be rewritten and harder to identify if (binaryExpression.NodeType == ExpressionType.Equal || binaryExpression.NodeType == ExpressionType.NotEqual) { @@ -239,7 +238,7 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression) var rightParent = default(Expression); var rightNavigation = default(INavigation); - // TODO: this is hacky and won't work for weak entity types + // TODO: this isn't robust and won't work for weak entity types // also, add support for EF.Property and maybe convert node around the navigation if (binaryExpression.Left is MemberExpression leftMember && leftMember.Type.TryGetSequenceType() is Type leftSequenceType diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor_MethodCall.cs b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor_MethodCall.cs index 5920c215cc1..a25d03fef91 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor_MethodCall.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpandingVisitor_MethodCall.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Query.Internal; @@ -281,14 +280,14 @@ private Expression ProcessSelectMany(MethodCallExpression methodCallExpression) var collectionSelector = methodCallExpression.Arguments[1].UnwrapQuote(); AdjustCurrentParameterName(outerSourceNee.State, collectionSelector.Parameters[0].Name); - var applyNavigsationsResult = FindAndApplyNavigations(outerSourceNee.Operand, collectionSelector, outerSourceNee.State); - var applyOrderingsResult = ApplyPendingOrderings(applyNavigsationsResult.source, applyNavigsationsResult.state); + var applyNavigationsResult = FindAndApplyNavigations(outerSourceNee.Operand, collectionSelector, outerSourceNee.State); + var applyOrderingsResult = ApplyPendingOrderings(applyNavigationsResult.source, applyNavigationsResult.state); var outerSource = applyOrderingsResult.source; var outerState = applyOrderingsResult.state; - var collectionSelectorNavigationExpansionExpression = applyNavigsationsResult.lambdaBody as NavigationExpansionExpression - ?? (applyNavigsationsResult.lambdaBody as NavigationExpansionRootExpression)?.Unwrap() as NavigationExpansionExpression; + var collectionSelectorNavigationExpansionExpression = applyNavigationsResult.lambdaBody as NavigationExpansionExpression + ?? (applyNavigationsResult.lambdaBody as NavigationExpansionRootExpression)?.Unwrap() as NavigationExpansionExpression; if (collectionSelectorNavigationExpansionExpression != null) { @@ -299,29 +298,8 @@ private Expression ProcessSelectMany(MethodCallExpression methodCallExpression) // it's not needed for SelectMany collection selectors as they are not directly projected collectionSelectorState.MaterializeCollectionNavigation = null; - if (methodCallExpression.Method.MethodIsClosedFormOf(LinqMethodHelpers.QueryableSelectManyWithResultOperatorMethodInfo)) - { - if (outerState.CurrentParameter.Name == null - && outerState.CurrentParameter.Name != methodCallExpression.Arguments[2].UnwrapQuote().Parameters[0].Name) - { - var newOuterParameter = Expression.Parameter(outerState.CurrentParameter.Type, methodCallExpression.Arguments[2].UnwrapQuote().Parameters[0].Name); - outerState.PendingSelector = (LambdaExpression)new ExpressionReplacingVisitor(outerState.CurrentParameter, newOuterParameter).Visit(outerState.PendingSelector); - collectionSelectorLambdaBody = new ExpressionReplacingVisitor(outerState.CurrentParameter, newOuterParameter).Visit(collectionSelectorLambdaBody); - outerState.CurrentParameter = newOuterParameter; - } - - if (collectionSelectorState.CurrentParameter.Name == null - && collectionSelectorState.CurrentParameter.Name != methodCallExpression.Arguments[2].UnwrapQuote().Parameters[1].Name) - { - var newInnerParameter = Expression.Parameter(collectionSelectorState.CurrentParameter.Type, methodCallExpression.Arguments[2].UnwrapQuote().Parameters[1].Name); - collectionSelectorState.PendingSelector = (LambdaExpression)new ExpressionReplacingVisitor(collectionSelectorState.CurrentParameter, newInnerParameter).Visit(collectionSelectorState.PendingSelector); - collectionSelectorState.CurrentParameter = newInnerParameter; - } - } - if (methodCallExpression.Method.MethodIsClosedFormOf(LinqMethodHelpers.QueryableSelectManyWithResultOperatorMethodInfo) - && (collectionSelectorState.CurrentParameter.Name == null - || collectionSelectorState.CurrentParameter.Name != methodCallExpression.Arguments[2].UnwrapQuote().Parameters[1].Name)) + && collectionSelectorState.CurrentParameter.Name != methodCallExpression.Arguments[2].UnwrapQuote().Parameters[1].Name) { // TODO: should we rename the second parameter according to the second parameter of the result selector instead? var newParameter = Expression.Parameter(collectionSelectorState.CurrentParameter.Type, methodCallExpression.Arguments[2].UnwrapQuote().Parameters[1].Name); @@ -404,7 +382,7 @@ private NavigationExpansionExpressionState CreateSelectManyInnerState(Navigation sourceMappingMapping[oldSourceMapping] = newSourceMapping; var newNavigationTreeRoot = NavigationTreeNode.CreateRoot(newSourceMapping, new List(), oldSourceMapping.NavigationTree.Optional); - // TODO: simply coyping ToMapping might not be correct for very complex cases where the child mapping is not purely Inner/Outer but has some properties from preivous anonymous projections + // TODO: simply copying ToMapping might not be correct for very complex cases where the child mapping is not purely Inner/Outer but has some properties from previous anonymous projections // we should recognize and filter those out, however this is theoretical at this point - scenario is not supported and likely won't be in the foreseeable future newNavigationTreeRoot.ToMapping = oldSourceMapping.NavigationTree.ToMapping.ToList(); newSourceMapping.NavigationTree = newNavigationTreeRoot; @@ -451,7 +429,7 @@ private void CopyNavigationTree( copy.ExpansionMode = child.ExpansionMode; copy.Included = child.Included; - // TODO: simply coyping ToMapping might not be correct for very complex cases where the child mapping is not purely Inner/Outer but has some properties from preivous anonymous projections + // TODO: simply copying ToMapping might not be correct for very complex cases where the child mapping is not purely Inner/Outer but has some properties from previous anonymous projections // we should recognize and filter those out, however this is theoretical at this point - scenario is not supported and likely won't be in the foreseeable future copy.ToMapping = child.ToMapping.ToList(); mapping[child] = copy; @@ -461,11 +439,11 @@ private void CopyNavigationTree( private class SelectManyCollectionPendingSelectorRemapper : ExpressionVisitor { - private ParameterExpression _oldParameter; - private ParameterExpression _newParameter; - private Dictionary _sourceMappingMapping; - private Dictionary _navigationTreeNodeMapping; - private Dictionary, List> _customRootMappingMapping; + private readonly ParameterExpression _oldParameter; + private readonly ParameterExpression _newParameter; + private readonly Dictionary _sourceMappingMapping; + private readonly Dictionary _navigationTreeNodeMapping; + private readonly Dictionary, List> _customRootMappingMapping; public SelectManyCollectionPendingSelectorRemapper( ParameterExpression oldParameter, @@ -603,7 +581,7 @@ private Expression ProcessGroupJoin(MethodCallExpression methodCallExpression) var innerApplyOrderingsResult = ApplyPendingOrderings(innerApplyNavigationsResult.source, innerApplyNavigationsResult.state); var resultSelectorBody = resultSelector.Body; - var remappedResultSelectorBody = ExpressionExtensions.CombineAndRemap(resultSelector.Body, resultSelector.Parameters[0], outerApplyOrderingsResult.state.PendingSelector.Body); + var remappedResultSelectorBody = resultSelector.Body.CombineAndRemap(resultSelector.Parameters[0], outerApplyOrderingsResult.state.PendingSelector.Body); var groupingParameter = resultSelector.Parameters[1]; var newGroupingParameter = Expression.Parameter(typeof(IEnumerable<>).MakeGenericType(innerApplyOrderingsResult.state.CurrentParameter.Type), "new_" + groupingParameter.Name); @@ -950,8 +928,8 @@ private Expression ProcessSkipTake(MethodCallExpression methodCallExpression) private class PendingSelectorReprojector : ExpressionVisitor { - private List _currentPath = new List(); - private CustomRootExpression _rootExpression; + private readonly List _currentPath = new List(); + private readonly CustomRootExpression _rootExpression; public PendingSelectorReprojector(CustomRootExpression rootExpression) { @@ -1047,7 +1025,7 @@ private Expression ProcessInclude(MethodCallExpression methodCallExpression) Expression remappedIncludeLambdaBody; if (methodCallExpression.Method.Name == "Include") { - remappedIncludeLambdaBody = ExpressionExtensions.CombineAndRemap(includeLambda.Body, includeLambda.Parameters[0], applyOrderingsResult.state.PendingSelector.Body); + remappedIncludeLambdaBody = includeLambda.Body.CombineAndRemap(includeLambda.Parameters[0], applyOrderingsResult.state.PendingSelector.Body); } else { @@ -1069,7 +1047,7 @@ private Expression ProcessInclude(MethodCallExpression methodCallExpression) else { var pendingIncludeChainLambda = Expression.Lambda(applyOrderingsResult.state.PendingIncludeChain, applyOrderingsResult.state.CurrentParameter); - remappedIncludeLambdaBody = ExpressionExtensions.CombineAndRemap(includeLambda.Body, includeLambda.Parameters[0], pendingIncludeChainLambda.Body); + remappedIncludeLambdaBody = includeLambda.Body.CombineAndRemap(includeLambda.Parameters[0], pendingIncludeChainLambda.Body); } } @@ -1244,7 +1222,7 @@ protected override Expression VisitConstant(ConstantExpression constantExpressio return (source, lambda.Body, state); } - var remappedLambdaBody = ExpressionExtensions.CombineAndRemap(lambda.Body, lambda.Parameters[0], state.PendingSelector.Body); + var remappedLambdaBody = lambda.Body.CombineAndRemap(lambda.Parameters[0], state.PendingSelector.Body); var binder = new NavigationPropertyBindingVisitor( state.PendingSelector.Parameters[0], @@ -1306,8 +1284,8 @@ protected override Expression VisitConstant(ConstantExpression constantExpressio NavigationExpansionExpressionState outerState, NavigationExpansionExpressionState innerState) { - var remappedResultSelectorBody = ExpressionExtensions.CombineAndRemap(resultSelector.Body, resultSelector.Parameters[0], outerState.PendingSelector.Body); - remappedResultSelectorBody = ExpressionExtensions.CombineAndRemap(remappedResultSelectorBody, resultSelector.Parameters[1], innerState.PendingSelector.Body); + var remappedResultSelectorBody = resultSelector.Body.CombineAndRemap(resultSelector.Parameters[0], outerState.PendingSelector.Body); + remappedResultSelectorBody = remappedResultSelectorBody.CombineAndRemap(resultSelector.Parameters[1], innerState.PendingSelector.Body); var outerBinder = new NavigationPropertyBindingVisitor( outerState.CurrentParameter, @@ -1389,13 +1367,13 @@ protected override Expression VisitConstant(ConstantExpression constantExpressio private class PendingSelectorSourceMappingGenerator : ExpressionVisitor { - private ParameterExpression _rootParameter; - private List _currentPath = new List(); - private IEntityType _entityTypeOverride; + private readonly ParameterExpression _rootParameter; + private readonly List _currentPath = new List(); + private readonly IEntityType _entityTypeOverride; - public List SourceMappings = new List(); + public readonly List SourceMappings = new List(); - public Dictionary BindingToSourceMapping + public readonly Dictionary BindingToSourceMapping = new Dictionary(); public PendingSelectorSourceMappingGenerator(ParameterExpression rootParameter, IEntityType entityTypeOverride) diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpansionCleanupVisitor.cs b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpansionCleanupVisitor.cs index 2baa69c62c1..303bebcec38 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpansionCleanupVisitor.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationExpansionCleanupVisitor.cs @@ -3,7 +3,6 @@ using System; using System.Linq.Expressions; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion.Visitors diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyBindingVisitor.cs b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyBindingVisitor.cs index 296daa29a20..fb6f8c76519 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyBindingVisitor.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyBindingVisitor.cs @@ -4,16 +4,16 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query.Expressions.Internal; namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion.Visitors { public class NavigationPropertyBindingVisitor : ExpressionVisitor { - private ParameterExpression _rootParameter; - private List _sourceMappings; - private bool _bindInclude; + private readonly ParameterExpression _rootParameter; + private readonly List _sourceMappings; + private readonly bool _bindInclude; public NavigationPropertyBindingVisitor( ParameterExpression rootParameter, @@ -191,7 +191,7 @@ private Expression TryBindProperty(Expression originalExpression, Expression new if (expression is ParameterExpression parameterExpression && (parameterExpression == _rootParameter)) { - var matchingCandidate = navigationTreeNodeCandidates.Where(m => m.path.Count == 0).SingleOrDefault(); + var matchingCandidate = navigationTreeNodeCandidates.SingleOrDefault(m => m.path.Count == 0); return matchingCandidate.navigationTreeNode != null ? (rootParameter: parameterExpression, matchingCandidate.navigationTreeNode) @@ -201,7 +201,7 @@ private Expression TryBindProperty(Expression originalExpression, Expression new if (expression is CustomRootExpression customRootExpression && customRootExpression.RootParameter == _rootParameter) { - var matchingCandidate = navigationTreeNodeCandidates.Where(m => m.path.Count == 0).SingleOrDefault(); + var matchingCandidate = navigationTreeNodeCandidates.SingleOrDefault(m => m.path.Count == 0); return matchingCandidate.navigationTreeNode != null ? (rootParameter: customRootExpression.RootParameter, matchingCandidate.navigationTreeNode) diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyUnbindingVisitor.cs b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyUnbindingVisitor.cs index e479f3679df..07d37d93a3d 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyUnbindingVisitor.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/NavigationPropertyUnbindingVisitor.cs @@ -8,7 +8,7 @@ namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion.Visitors { public class NavigationPropertyUnbindingVisitor : ExpressionVisitor { - private ParameterExpression _rootParameter; + private readonly ParameterExpression _rootParameter; public NavigationPropertyUnbindingVisitor(ParameterExpression rootParameter) { diff --git a/src/EFCore/Query/NavigationExpansion/Visitors/PendingIncludeFindingVisitor.cs b/src/EFCore/Query/NavigationExpansion/Visitors/PendingIncludeFindingVisitor.cs index 77efd766069..ae4dd3e703b 100644 --- a/src/EFCore/Query/NavigationExpansion/Visitors/PendingIncludeFindingVisitor.cs +++ b/src/EFCore/Query/NavigationExpansion/Visitors/PendingIncludeFindingVisitor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq.Expressions; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion.Visitors { diff --git a/src/EFCore/Query/Pipeline/EntityEqualityRewritingExpressionVisitor.cs b/src/EFCore/Query/Pipeline/EntityEqualityRewritingExpressionVisitor.cs index 2867ba5c283..f501a4bf805 100644 --- a/src/EFCore/Query/Pipeline/EntityEqualityRewritingExpressionVisitor.cs +++ b/src/EFCore/Query/Pipeline/EntityEqualityRewritingExpressionVisitor.cs @@ -8,12 +8,10 @@ using System.Reflection; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Query.Expressions.Internal; using Microsoft.EntityFrameworkCore.Query.Internal; -using Microsoft.EntityFrameworkCore.Query.NavigationExpansion; namespace Microsoft.EntityFrameworkCore.Query.Pipeline { @@ -151,7 +149,7 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp if (methodCallExpression.Method.DeclaringType == typeof(Queryable) || methodCallExpression.Method.DeclaringType == typeof(Enumerable) - || methodCallExpression.Method.DeclaringType == typeof(EntityQueryableExtensions)) + || methodCallExpression.Method.DeclaringType == typeof(QueryableExtensions)) { switch (methodCallExpression.Method.Name) { @@ -163,7 +161,7 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp case nameof(Queryable.GroupJoin): case nameof(Queryable.Join): - case nameof(EntityQueryableExtensions.LeftJoin): + case nameof(QueryableExtensions.LeftJoin): return VisitJoinMethodCall(methodCallExpression); case nameof(Queryable.GroupBy): // TODO: Implement diff --git a/src/EFCore/Query/Pipeline/EntityQueryableExtensions.cs b/src/EFCore/Query/Pipeline/EntityQueryableExtensions.cs deleted file mode 100644 index 49fac7a2ba3..00000000000 --- a/src/EFCore/Query/Pipeline/EntityQueryableExtensions.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace Microsoft.EntityFrameworkCore.Query.Pipeline -{ - public static class EntityQueryableExtensions - { - public static IQueryable LeftJoin( - this IQueryable outer, - IEnumerable inner, - Expression> outerKeySelector, - Expression> innerKeySelector, - Expression> resultSelector) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/EFCore/Query/Pipeline/GroupJoinFlatteningExpressionVisitor.cs b/src/EFCore/Query/Pipeline/GroupJoinFlatteningExpressionVisitor.cs index bc4ad09a358..3ce69608298 100644 --- a/src/EFCore/Query/Pipeline/GroupJoinFlatteningExpressionVisitor.cs +++ b/src/EFCore/Query/Pipeline/GroupJoinFlatteningExpressionVisitor.cs @@ -6,39 +6,40 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; +using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.Query.Pipeline { public class GroupJoinFlatteningExpressionVisitor : ExpressionVisitor { - private static MethodInfo _whereMethodInfo = typeof(Queryable).GetTypeInfo() + private static readonly MethodInfo _whereMethodInfo = typeof(Queryable).GetTypeInfo() .GetDeclaredMethods(nameof(Queryable.Where)) .Single(mi => mi.GetParameters().Length == 2 && mi.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments().Length == 2); - private static MethodInfo _groupJoinMethodInfo = typeof(Queryable).GetTypeInfo() + private static readonly MethodInfo _groupJoinMethodInfo = typeof(Queryable).GetTypeInfo() .GetDeclaredMethods(nameof(Queryable.GroupJoin)).Single(mi => mi.GetParameters().Length == 5); - private static MethodInfo _defaultIfEmptyWithoutArgMethodInfo = typeof(Enumerable).GetTypeInfo() + private static readonly MethodInfo _defaultIfEmptyWithoutArgMethodInfo = typeof(Enumerable).GetTypeInfo() .GetDeclaredMethods(nameof(Enumerable.DefaultIfEmpty)).Single(mi => mi.GetParameters().Length == 1); - private static MethodInfo _selectManyWithCollectionSelectorMethodInfo = typeof(Queryable).GetTypeInfo() + private static readonly MethodInfo _selectManyWithCollectionSelectorMethodInfo = typeof(Queryable).GetTypeInfo() .GetDeclaredMethods(nameof(Queryable.SelectMany)) .Single(mi => mi.GetParameters().Length == 3 && mi.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments().Length == 2); - private static MethodInfo _selectManyWithoutCollectionSelectorMethodInfo = typeof(Queryable).GetTypeInfo() + private static readonly MethodInfo _selectManyWithoutCollectionSelectorMethodInfo = typeof(Queryable).GetTypeInfo() .GetDeclaredMethods(nameof(Queryable.SelectMany)) .Single(mi => mi.GetParameters().Length == 2 && mi.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments().Length == 2); - private static MethodInfo _joinMethodInfo = typeof(Queryable).GetTypeInfo() + private static readonly MethodInfo _joinMethodInfo = typeof(Queryable).GetTypeInfo() .GetDeclaredMethods(nameof(Queryable.Join)).Single(mi => mi.GetParameters().Length == 5); - private static MethodInfo _leftJoinMethodInfo = typeof(EntityQueryableExtensions).GetTypeInfo() - .GetDeclaredMethods(nameof(EntityQueryableExtensions.LeftJoin)).Single(mi => mi.GetParameters().Length == 5); + private static readonly MethodInfo _leftJoinMethodInfo = typeof(QueryableExtensions).GetTypeInfo() + .GetDeclaredMethods(nameof(QueryableExtensions.LeftJoin)).Single(mi => mi.GetParameters().Length == 5); - private static SelectManyVerifyingExpressionVisitor _selectManyVerifyingExpressionVisitor + private static readonly SelectManyVerifyingExpressionVisitor _selectManyVerifyingExpressionVisitor = new SelectManyVerifyingExpressionVisitor(); - private static EnumerableToQueryableReMappingExpressionVisitor _enumerableToQueryableReMappingExpressionVisitor + private static readonly EnumerableToQueryableReMappingExpressionVisitor _enumerableToQueryableReMappingExpressionVisitor = new EnumerableToQueryableReMappingExpressionVisitor(); protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) diff --git a/src/EFCore/Query/Pipeline/ParameterExtractingExpressionVisitor.cs b/src/EFCore/Query/Pipeline/ParameterExtractingExpressionVisitor.cs index eaedc6b022f..4c9c6a6d3f8 100644 --- a/src/EFCore/Query/Pipeline/ParameterExtractingExpressionVisitor.cs +++ b/src/EFCore/Query/Pipeline/ParameterExtractingExpressionVisitor.cs @@ -2,13 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query.Internal; diff --git a/src/EFCore/Query/Pipeline/QueryableMethodTranslatingExpressionVisitor.cs b/src/EFCore/Query/Pipeline/QueryableMethodTranslatingExpressionVisitor.cs index d2494338945..e6874b98a87 100644 --- a/src/EFCore/Query/Pipeline/QueryableMethodTranslatingExpressionVisitor.cs +++ b/src/EFCore/Query/Pipeline/QueryableMethodTranslatingExpressionVisitor.cs @@ -7,6 +7,7 @@ using System.Linq.Expressions; using System.Reflection; using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query.NavigationExpansion.Visitors; namespace Microsoft.EntityFrameworkCore.Query.Pipeline @@ -26,7 +27,7 @@ protected override Expression VisitExtension(Expression extensionExpression) protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) { if (methodCallExpression.Method.DeclaringType == typeof(Queryable) - || methodCallExpression.Method.DeclaringType == typeof(EntityQueryableExtensions)) + || methodCallExpression.Method.DeclaringType == typeof(QueryableExtensions)) { var source = Visit(methodCallExpression.Arguments[0]); if (source is ShapedQueryExpression shapedQueryExpression) @@ -244,7 +245,7 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp break; - case nameof(EntityQueryableExtensions.LeftJoin) + case nameof(QueryableExtensions.LeftJoin) when argumentCount == 5: { var innerSource = Visit(methodCallExpression.Arguments[1]); diff --git a/src/EFCore/Extensions/ExecutionStrategyExtensions.cs b/src/EFCore/Storage/ExecutionStrategyExtensions.cs similarity index 100% rename from src/EFCore/Extensions/ExecutionStrategyExtensions.cs rename to src/EFCore/Storage/ExecutionStrategyExtensions.cs diff --git a/src/Microsoft.Data.Sqlite.Core/Extensions/SQLitePCLExtensions.cs b/src/Microsoft.Data.Sqlite.Core/Extensions/SQLitePCLExtensions.cs index b7d3301cd9e..2fdc1659834 100644 --- a/src/Microsoft.Data.Sqlite.Core/Extensions/SQLitePCLExtensions.cs +++ b/src/Microsoft.Data.Sqlite.Core/Extensions/SQLitePCLExtensions.cs @@ -5,6 +5,7 @@ using static SQLitePCL.raw; +// ReSharper disable once CheckNamespace namespace SQLitePCL { internal static class SQLitePCLExtensions diff --git a/src/Microsoft.Data.Sqlite.Core/Extensions/SqliteConnectionExtensions.cs b/src/Microsoft.Data.Sqlite.Core/Extensions/SqliteConnectionExtensions.cs index 55876a683f1..dd26d33a392 100644 --- a/src/Microsoft.Data.Sqlite.Core/Extensions/SqliteConnectionExtensions.cs +++ b/src/Microsoft.Data.Sqlite.Core/Extensions/SqliteConnectionExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// ReSharper disable once CheckNamespace namespace Microsoft.Data.Sqlite { internal static class SqliteConnectionExtensions diff --git a/src/Microsoft.Data.Sqlite.Core/Extensions/TypeExtensions.cs b/src/Microsoft.Data.Sqlite.Core/Extensions/TypeExtensions.cs index d7ac9889ef2..e975d7531c0 100644 --- a/src/Microsoft.Data.Sqlite.Core/Extensions/TypeExtensions.cs +++ b/src/Microsoft.Data.Sqlite.Core/Extensions/TypeExtensions.cs @@ -3,6 +3,7 @@ using System.Reflection; +// ReSharper disable once CheckNamespace namespace System { internal static class TypeExtensions diff --git a/test/EFCore.Cosmos.Tests/Metadata/CosmosBuilderExtensionsTest.cs b/test/EFCore.Cosmos.Tests/Metadata/CosmosBuilderExtensionsTest.cs index 6cc9d4f6bc5..09f8359234e 100644 --- a/test/EFCore.Cosmos.Tests/Metadata/CosmosBuilderExtensionsTest.cs +++ b/test/EFCore.Cosmos.Tests/Metadata/CosmosBuilderExtensionsTest.cs @@ -4,7 +4,8 @@ using Microsoft.EntityFrameworkCore.Cosmos.TestUtilities; using Xunit; -namespace Microsoft.EntityFrameworkCore.Cosmos.Metadata +// ReSharper disable once CheckNamespace +namespace Microsoft.EntityFrameworkCore.Metadata { public class CosmosBuilderExtensionsTest { diff --git a/test/EFCore.Cosmos.Tests/Metadata/CosmosMetadataExtensionsTest.cs b/test/EFCore.Cosmos.Tests/Metadata/CosmosMetadataExtensionsTest.cs index 4a0e17c21da..0557e7856c2 100644 --- a/test/EFCore.Cosmos.Tests/Metadata/CosmosMetadataExtensionsTest.cs +++ b/test/EFCore.Cosmos.Tests/Metadata/CosmosMetadataExtensionsTest.cs @@ -5,7 +5,8 @@ using Microsoft.EntityFrameworkCore.Metadata.Conventions; using Xunit; -namespace Microsoft.EntityFrameworkCore +// ReSharper disable once CheckNamespace +namespace Microsoft.EntityFrameworkCore.Metadata { public class CosmosMetadataExtensionsTest { diff --git a/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs b/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs index 37480ba4279..336ef9d3bd3 100644 --- a/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs +++ b/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs @@ -1,11 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Metadata.Internal; -using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; diff --git a/test/EFCore.Cosmos.Tests/ValueGenerator/Internal/IdValueGeneratorTest.cs b/test/EFCore.Cosmos.Tests/ValueGenerator/Internal/IdValueGeneratorTest.cs index 32011f9f007..b8716328b21 100644 --- a/test/EFCore.Cosmos.Tests/ValueGenerator/Internal/IdValueGeneratorTest.cs +++ b/test/EFCore.Cosmos.Tests/ValueGenerator/Internal/IdValueGeneratorTest.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Microsoft.EntityFrameworkCore.Cosmos.TestUtilities; +using Microsoft.EntityFrameworkCore.TestUtilities; using Xunit; namespace Microsoft.EntityFrameworkCore.Cosmos.ValueGenerator.Internal diff --git a/test/EFCore.Specification.Tests/LoadTestBase.cs b/test/EFCore.Specification.Tests/LoadTestBase.cs index 5c4ebb7f231..20a67e67b10 100644 --- a/test/EFCore.Specification.Tests/LoadTestBase.cs +++ b/test/EFCore.Specification.Tests/LoadTestBase.cs @@ -11,6 +11,7 @@ using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Diagnostics.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; using Xunit; diff --git a/test/EFCore.Specification.Tests/Query/CompiledQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/CompiledQueryTestBase.cs index c336ec38b0c..c3736db7656 100644 --- a/test/EFCore.Specification.Tests/Query/CompiledQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/CompiledQueryTestBase.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.TestModels.Northwind; using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.EntityFrameworkCore.TestUtilities.Xunit; diff --git a/test/EFCore.Specification.Tests/TestModels/Northwind/NorthwindData.cs b/test/EFCore.Specification.Tests/TestModels/Northwind/NorthwindData.cs index a15f1193adf..7ee584fac5f 100644 --- a/test/EFCore.Specification.Tests/TestModels/Northwind/NorthwindData.cs +++ b/test/EFCore.Specification.Tests/TestModels/Northwind/NorthwindData.cs @@ -7,8 +7,8 @@ using System.Linq; using System.Linq.Expressions; using System.Threading; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query.Internal; using Microsoft.EntityFrameworkCore.TestUtilities; diff --git a/src/EFCore.Relational/Internal/RelationalPropertyExtensions.cs b/test/EFCore.Specification.Tests/TestUtilities/EnumerableExtensions.cs similarity index 55% rename from src/EFCore.Relational/Internal/RelationalPropertyExtensions.cs rename to test/EFCore.Specification.Tests/TestUtilities/EnumerableExtensions.cs index 7de22ab9be0..85d01a17571 100644 --- a/src/EFCore.Relational/Internal/RelationalPropertyExtensions.cs +++ b/test/EFCore.Specification.Tests/TestUtilities/EnumerableExtensions.cs @@ -1,21 +1,16 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; -using JetBrains.Annotations; -using Microsoft.EntityFrameworkCore.Metadata; +using System.Threading; +using System.Threading.Tasks; +// ReSharper disable once CheckNamespace namespace Microsoft.EntityFrameworkCore.Internal { - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - public static class RelationalPropertyExtensions + public static class EnumerableExtensions { /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -23,8 +18,17 @@ public static class RelationalPropertyExtensions /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public static string FormatColumns([NotNull] this IEnumerable properties) - => "{" + string.Join(", ", properties.Select(p => "'" + p.GetColumnName() + "'")) + "}"; + public static async Task> ToListAsync( + this IAsyncEnumerable source, CancellationToken cancellationToken = default) + { + var list = new List(); + await foreach (var element in source.WithCancellation(cancellationToken)) + { + list.Add(element); + } + + return list; + } /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -32,8 +36,7 @@ public static string FormatColumns([NotNull] this IEnumerable propert /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - [DebuggerStepThrough] - public static string GetConfiguredColumnType([NotNull] this IProperty property) - => (string)property[RelationalAnnotationNames.ColumnType]; + public static List ToList(this IEnumerable source) + => source.OfType().ToList(); } } diff --git a/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/AppendIncludeToExistingExpressionMutator.cs b/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/AppendIncludeToExistingExpressionMutator.cs index 5e5ade13bba..5a5dbc641c0 100644 --- a/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/AppendIncludeToExistingExpressionMutator.cs +++ b/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/AppendIncludeToExistingExpressionMutator.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.TestUtilities.QueryTestGeneration { @@ -20,7 +20,7 @@ public AppendIncludeToExistingExpressionMutator(DbContext context) public override bool IsValid(Expression expression) { - _expressionFinder = new ExpressionFinder(this); + _expressionFinder = new ExpressionFinder(); _expressionFinder.Visit(expression); return _expressionFinder.FoundExpressions.Any(); @@ -87,13 +87,6 @@ public override Expression Apply(Expression expression, Random random) private class ExpressionFinder : ExpressionVisitor { - private AppendIncludeToExistingExpressionMutator _mutator; - - public ExpressionFinder(AppendIncludeToExistingExpressionMutator mutator) - { - _mutator = mutator; - } - public readonly List FoundExpressions = new List(); protected override Expression VisitMethodCall(MethodCallExpression node) diff --git a/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/InjectStringFunctionExpressionMutator.cs b/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/InjectStringFunctionExpressionMutator.cs index 065ff19299e..553ccf318c8 100644 --- a/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/InjectStringFunctionExpressionMutator.cs +++ b/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/InjectStringFunctionExpressionMutator.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.TestUtilities.QueryTestGeneration { @@ -51,8 +51,8 @@ public override Expression Visit(Expression node) if (_insideLambda && !_insideEFProperty && node?.Type == typeof(string) - && node?.NodeType != ExpressionType.Parameter - && (node?.NodeType != ExpressionType.Constant || ((ConstantExpression)node)?.Value != null)) + && node.NodeType != ExpressionType.Parameter + && (node.NodeType != ExpressionType.Constant || ((ConstantExpression)node)?.Value != null)) { FoundExpressions.Add(node); } diff --git a/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/StringConcatWithSelfExpressionMutator.cs b/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/StringConcatWithSelfExpressionMutator.cs index 58293f0c142..6d9c3a9cf59 100644 --- a/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/StringConcatWithSelfExpressionMutator.cs +++ b/test/EFCore.Specification.Tests/TestUtilities/QueryTestGeneration/StringConcatWithSelfExpressionMutator.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.TestUtilities.QueryTestGeneration { diff --git a/test/EFCore.Specification.Tests/TestUtilities/QueryableExtensions.cs b/test/EFCore.Specification.Tests/TestUtilities/QueryableExtensions.cs deleted file mode 100644 index 2194486dfee..00000000000 --- a/test/EFCore.Specification.Tests/TestUtilities/QueryableExtensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore.Extensions.Internal; - -namespace Microsoft.EntityFrameworkCore.TestUtilities -{ - public static class QueryableExtensions - { - public static List ToList(this System.Collections.IEnumerable source) - => source.OfType().ToList(); - - public static Task> ToListAsync(this IQueryable source, CancellationToken cancellationToken = default) - { - return ((IQueryable)source).ToListAsync(cancellationToken); - } - - public static async Task> ToListAsync(this IAsyncEnumerable source, CancellationToken cancellationToken = default) - { - var list = new List(); - await foreach (var element in source.WithCancellation(cancellationToken)) - { - list.Add(element); - } - - return list; - } - } -} diff --git a/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientCascade.cs b/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientCascade.cs index a07467420b5..c9699cea6bf 100644 --- a/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientCascade.cs +++ b/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientCascade.cs @@ -24,7 +24,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con foreach (var foreignKey in modelBuilder.Model .GetEntityTypes() - .SelectMany(e => MutableEntityTypeExtensions.GetDeclaredForeignKeys(e)) + .SelectMany(e => e.GetDeclaredForeignKeys()) .Where(e => e.DeleteBehavior == DeleteBehavior.Cascade)) { foreignKey.DeleteBehavior = DeleteBehavior.ClientCascade; diff --git a/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientNoAction.cs b/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientNoAction.cs index ddd6330a4a8..537029c31ac 100644 --- a/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientNoAction.cs +++ b/test/EFCore.SqlServer.FunctionalTests/GraphUpdatesSqlServerTestClientNoAction.cs @@ -24,7 +24,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con foreach (var foreignKey in modelBuilder.Model .GetEntityTypes() - .SelectMany(e => MutableEntityTypeExtensions.GetDeclaredForeignKeys(e))) + .SelectMany(e => e.GetDeclaredForeignKeys())) { foreignKey.DeleteBehavior = DeleteBehavior.ClientNoAction; } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/AsyncSimpleQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/AsyncSimpleQuerySqlServerTest.cs index 62a36fc0dfa..8c820ad4692 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/AsyncSimpleQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/AsyncSimpleQuerySqlServerTest.cs @@ -4,7 +4,7 @@ using System; using System.Linq; using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore.Extensions.Internal; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.TestModels.Northwind; diff --git a/test/EFCore.SqlServer.Tests/Design/SqlServerDesignTimeProviderServicesTest.cs b/test/EFCore.SqlServer.Tests/Design/SqlServerDesignTimeProviderServicesTest.cs index ce447e12846..43fc7d5d186 100644 --- a/test/EFCore.SqlServer.Tests/Design/SqlServerDesignTimeProviderServicesTest.cs +++ b/test/EFCore.SqlServer.Tests/Design/SqlServerDesignTimeProviderServicesTest.cs @@ -3,11 +3,10 @@ using System; using System.Reflection; -using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.SqlServer.Design.Internal; using Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal; -namespace Microsoft.EntityFrameworkCore +namespace Microsoft.EntityFrameworkCore.Design { public class SqlServerDesignTimeProviderServicesTest : DesignTimeProviderServicesTest { diff --git a/test/EFCore.Tests/ExceptionTest.cs b/test/EFCore.Tests/ExceptionTest.cs index 2be68fa634f..96d486eddf7 100644 --- a/test/EFCore.Tests/ExceptionTest.cs +++ b/test/EFCore.Tests/ExceptionTest.cs @@ -13,6 +13,7 @@ using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.EntityFrameworkCore.Update; using Xunit; +// ReSharper disable InconsistentNaming namespace Microsoft.EntityFrameworkCore { @@ -186,7 +187,7 @@ public FakeInternalEntityEntry() public override object Entity { get; } } - private static IEntityType CreateEntityType() + private static IEntityType CreateEntityType() { var model = new Model(new ConventionSet()); var entityType = model.AddEntityType(typeof(object), ConfigurationSource.Convention); diff --git a/test/EFCore.Tests/Extensions/PropertyExtensionsTest.cs b/test/EFCore.Tests/Extensions/PropertyExtensionsTest.cs index 24febb9ce67..a127f50ad30 100644 --- a/test/EFCore.Tests/Extensions/PropertyExtensionsTest.cs +++ b/test/EFCore.Tests/Extensions/PropertyExtensionsTest.cs @@ -11,7 +11,8 @@ using Microsoft.EntityFrameworkCore.TestUtilities; using Xunit; -namespace Microsoft.EntityFrameworkCore.Extensions +// ReSharper disable once CheckNamespace +namespace Microsoft.EntityFrameworkCore { public class PropertyExtensionsTest { diff --git a/test/EFCore.Tests/Extensions/QueryableExtensionsTest.cs b/test/EFCore.Tests/Extensions/QueryableExtensionsTest.cs index c480f8819b3..985e93afd1c 100644 --- a/test/EFCore.Tests/Extensions/QueryableExtensionsTest.cs +++ b/test/EFCore.Tests/Extensions/QueryableExtensionsTest.cs @@ -9,14 +9,15 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.EntityFrameworkCore.Extensions.Internal; using Microsoft.EntityFrameworkCore.Internal; using Microsoft.EntityFrameworkCore.Query.Internal; using Microsoft.EntityFrameworkCore.TestModels.Northwind; using Xunit; +// ReSharper disable InconsistentNaming // ReSharper disable RedundantArgumentDefaultValue -namespace Microsoft.EntityFrameworkCore.Extensions +// ReSharper disable once CheckNamespace +namespace Microsoft.EntityFrameworkCore { public class QueryableExtensionsTest { diff --git a/test/EFCore.Tests/Extensions/ServiceProviderExtensionsTest.cs b/test/EFCore.Tests/Extensions/ServiceProviderExtensionsTest.cs index b444556eaa7..046bc445c36 100644 --- a/test/EFCore.Tests/Extensions/ServiceProviderExtensionsTest.cs +++ b/test/EFCore.Tests/Extensions/ServiceProviderExtensionsTest.cs @@ -5,7 +5,8 @@ using Microsoft.Extensions.DependencyInjection; using Xunit; -namespace Microsoft.EntityFrameworkCore.Extensions +// ReSharper disable InconsistentNaming +namespace Microsoft.EntityFrameworkCore { public class ServiceProviderExtensionsTest {