diff --git a/src/EFCore.Jet.Data/JetConnection.cs b/src/EFCore.Jet.Data/JetConnection.cs index 1ee7514..c7246ab 100644 --- a/src/EFCore.Jet.Data/JetConnection.cs +++ b/src/EFCore.Jet.Data/JetConnection.cs @@ -21,14 +21,14 @@ namespace EntityFrameworkCore.Jet.Data internal DbConnection InnerConnection { get; private set; } internal JetTransaction ActiveTransaction { get; set; } - + internal int RowCount { get; set; } - + internal string ActiveConnectionString { get; private set; } internal string FileNameOrConnectionString => ConnectionString; public const string DefaultDualTableName = "#Dual"; - + /// /// Initializes a new instance of the class. /// @@ -325,7 +325,7 @@ namespace EntityFrameworkCore.Jet.Data : null; string connectionString; - + if (IsConnectionString(fileNameOrConnectionString)) { // If the connection string is an actual connection string and not just a file path, then we should @@ -354,7 +354,7 @@ namespace EntityFrameworkCore.Jet.Data } DataAccessProviderFactory ??= JetFactory.Instance.GetDataAccessProviderFactory(dataAccessProviderType.Value); - + // It is possible, that a connection string was provided, that left out the actual ACE/Jet provider // information, but is in a distinctive style (ODBC or OLE DB) anyway. // In that case, we need to retrieving the data access provider type's most recent ACE/Jet provider. @@ -369,11 +369,11 @@ namespace EntityFrameworkCore.Jet.Data if (provider == null) throw new InvalidOperationException($"Unable to find any compatible {Enum.GetName(typeof(DataAccessProviderType), dataAccessProviderType)} provider for the connection string: {fileNameOrConnectionString}"); - + connectionStringBuilder.SetProvider(provider); connectionString = connectionStringBuilder.ToString(); } - + // Enable ExtendedAnsiSQL when using ODBC to support ODBC 4.0 statements (like CREATE VIEW). if (dataAccessProviderType == DataAccessProviderType.Odbc) { @@ -385,7 +385,7 @@ namespace EntityFrameworkCore.Jet.Data } connectionString = ExpandDatabaseFilePath(connectionString, DataAccessProviderFactory); - + try { InnerConnection = InnerConnectionFactory.Instance.OpenConnection( @@ -465,7 +465,7 @@ namespace EntityFrameworkCore.Jet.Data // SqlCommand will complain if the command text is empty commandText = Environment.NewLine; - var command = (JetCommand) JetFactory.CreateCommand(); + var command = (JetCommand)JetFactory.CreateCommand(); command.CommandText = commandText; if (commandTimeout.HasValue) @@ -519,7 +519,7 @@ namespace EntityFrameworkCore.Jet.Data string fileNameOrConnectionString, DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, - string? databasePassword = null, + string databasePassword = null, SchemaProviderType schemaProviderType = SchemaProviderType.Precise, DataAccessProviderType? dataAccessProviderType = null) { @@ -532,7 +532,7 @@ namespace EntityFrameworkCore.Jet.Data // // Create database: // - + var databaseCreator = JetDatabaseCreator.CreateInstance(schemaProviderType); databaseCreator.CreateDatabase(fileNameOrConnectionString, version, collatingOrder, databasePassword); @@ -560,7 +560,7 @@ namespace EntityFrameworkCore.Jet.Data using var connection = new JetConnection(connectionString, dataAccessProviderFactory); connection.Open(); - + using var schemaProvider = SchemaProvider.CreateInstance(schemaProviderType, connection); schemaProvider.EnsureDualTable(); } @@ -570,7 +570,7 @@ namespace EntityFrameworkCore.Jet.Data public static string GetConnectionString(string fileNameOrConnectionString, DataAccessProviderType? dataAccessProviderType = null) { - var providerType = dataAccessProviderType ?? JetConfiguration.DefaultDataAccessProviderType; + var providerType = dataAccessProviderType ?? JetConfiguration.DefaultDataAccessProviderType; return GetConnectionString(fileNameOrConnectionString, providerType, JetFactory.Instance.GetDataAccessProviderFactory(providerType)); } @@ -589,7 +589,7 @@ namespace EntityFrameworkCore.Jet.Data => dataAccessProviderType == DataAccessProviderType.OleDb ? $"Provider={provider};Data Source={JetStoreDatabaseHandling.ExpandFileName(fileName)}" : $"Driver={{{provider}}};DBQ={JetStoreDatabaseHandling.ExpandFileName(fileName)}"; - + private static string ExpandDatabaseFilePath(string connectionString, DbProviderFactory dataAccessProviderFactory) { var connectionStringBuilder = dataAccessProviderFactory.CreateConnectionStringBuilder(); @@ -614,7 +614,7 @@ namespace EntityFrameworkCore.Jet.Data public bool DatabaseExists() => DatabaseExists(_connectionString); - + public SchemaProviderType SchemaProviderType { get; set; } public static bool DatabaseExists(string fileNameOrConnectionString) diff --git a/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs b/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs index b406815..87c107a 100644 --- a/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs +++ b/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs @@ -6,6 +6,7 @@ using System.Linq.Expressions; using EntityFrameworkCore.Jet.Query.Internal; using EntityFrameworkCore.Jet.Utilities; using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; namespace EntityFrameworkCore.Jet.Query.Internal; @@ -36,25 +37,25 @@ public class JetParameterBasedSqlProcessor : RelationalParameterBasedSqlProcesso /// 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 override Expression Optimize( - Expression queryExpression, - IReadOnlyDictionary parametersValues, + public override SelectExpression Optimize( + SelectExpression selectExpression, + IReadOnlyDictionary parametersValues, out bool canCache) { - var optimizedQueryExpression = base.Optimize(queryExpression, parametersValues, out canCache); + var optimizedSelectExpression = base.Optimize(selectExpression, parametersValues, out canCache); - /*optimizedQueryExpression = new SkipTakeCollapsingExpressionVisitor(Dependencies.SqlExpressionFactory) - .Process(optimizedQueryExpression, parametersValues, out var canCache2);*/ + /*optimizedSelectExpression = new SkipTakeCollapsingExpressionVisitor(Dependencies.SqlExpressionFactory) + .Process(optimizedSelectExpression, parametersValues, out var canCache2);*/ //canCache &= canCache2; - return new SearchConditionConvertingExpressionVisitor(Dependencies.SqlExpressionFactory).Visit(optimizedQueryExpression); + return (SelectExpression)new SearchConditionConvertingExpressionVisitor(Dependencies.SqlExpressionFactory).Visit(optimizedSelectExpression); } /// - protected override Expression ProcessSqlNullability( - Expression selectExpression, - IReadOnlyDictionary parametersValues, + protected override SelectExpression ProcessSqlNullability( + SelectExpression selectExpression, + IReadOnlyDictionary parametersValues, out bool canCache) { Check.NotNull(selectExpression, nameof(selectExpression));