From 44aea7795b300565bd74a41fee557d65c1a84a1e Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sat, 18 Feb 2023 10:23:14 +0800 Subject: [PATCH] Dual table: Auto detect the dual table name on model load. Use that table for any queries. Also allow a custom override name to be set --- src/EFCore.Jet.Data/JetConfiguration.cs | 17 ++++++----------- .../Query/Sql/Internal/JetQuerySqlGenerator.cs | 2 +- .../Internal/JetDatabaseModelFactory.cs | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/EFCore.Jet.Data/JetConfiguration.cs b/src/EFCore.Jet.Data/JetConfiguration.cs index 314976e..6f0f2b5 100644 --- a/src/EFCore.Jet.Data/JetConfiguration.cs +++ b/src/EFCore.Jet.Data/JetConfiguration.cs @@ -57,18 +57,13 @@ namespace EntityFrameworkCore.Jet.Data /// /// The DUAL table or query /// - public static string DUAL { get; set; } = DUALForAccdb; - - /// - /// The dual table for accdb - /// - public const string DUALForMdb = "(SELECT COUNT(*) FROM MSysRelationships)"; - - /// - /// The dual table for accdb - /// - public const string DUALForAccdb = "(SELECT COUNT(*) FROM MSysAccessStorage)"; + public static string CustomDualTableName = ""; + //MSysRelationships + //MSysAccessStorage + //#Dual + //(SELECT COUNT(*) FROM MSysAccessStorage) + public static string DetectedDualTableName = "#Dual"; /// /// Gets or sets a value indicating whether show SQL statements. /// diff --git a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs index ffa9e50..3f49a01 100644 --- a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs +++ b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs @@ -224,7 +224,7 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal protected override void GeneratePseudoFromClause() { Sql.AppendLine() - .Append("FROM " + JetConfiguration.DUAL); + .Append("FROM " + "(SELECT COUNT(*) FROM `" + (string.IsNullOrEmpty(JetConfiguration.CustomDualTableName) ? JetConfiguration.DetectedDualTableName : JetConfiguration.CustomDualTableName) + "`)"); } private void GenerateList( diff --git a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs index c0bd494..708b0c1 100644 --- a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs +++ b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs @@ -105,7 +105,21 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal table.Database = databaseModel; databaseModel.Tables.Add(table); } - + + var tableNames = databaseModel.Tables.Select(t => t.Name).ToList(); + if (tableNames.Contains("MSysAccessStorage")) + { + JetConfiguration.DetectedDualTableName = "MSysAccessStorage"; + } + else if (tableNames.Contains("MSysRelationships")) + { + JetConfiguration.DetectedDualTableName = "MSysRelationships"; + } + else if (tableNames.Contains("#Dual")) + { + JetConfiguration.DetectedDualTableName = "#Dual"; + } + return databaseModel; } finally