diff --git a/Dapper.sln b/Dapper.sln index e993c7a4..4aa75f10 100644 --- a/Dapper.sln +++ b/Dapper.sln @@ -16,7 +16,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution version.json = version.json EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dapper.Contrib", "Dapper.Contrib\Dapper.Contrib.csproj", "{4E409F8F-CFBB-4332-8B0A-FD5A283051FD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dapper.Contrib", "src\Dapper.Contrib\Dapper.Contrib.csproj", "{4E409F8F-CFBB-4332-8B0A-FD5A283051FD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dapper.Tests.Contrib", "tests\Dapper.Tests.Contrib\Dapper.Tests.Contrib.csproj", "{DAB3C5B7-BCD1-4A5F-BB6B-50D2BB63DB4A}" EndProject diff --git a/src/Dapper.Contrib/SqlMapperExtensions.Async.cs b/src/Dapper.Contrib/SqlMapperExtensions.Async.cs index c93e39a4..508b84af 100644 --- a/src/Dapper.Contrib/SqlMapperExtensions.Async.cs +++ b/src/Dapper.Contrib/SqlMapperExtensions.Async.cs @@ -25,13 +25,22 @@ public static partial class SqlMapperExtensions public static async Task GetAsync(this IDbConnection connection, dynamic id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { var type = typeof(T); - if (!GetQueries.TryGetValue(type.TypeHandle, out string sql)) + + // get query caching depends on connection specific formatting + var typeTuple = Tuple.Create(connection.GetType().TypeHandle, type.TypeHandle); + + if (!GetQueries.TryGetValue(typeTuple, out string sql)) { var key = GetSingleKey(nameof(GetAsync)); var name = GetTableName(type); - sql = $"SELECT * FROM {name} WHERE {key.Name} = @id"; - GetQueries[type.TypeHandle] = sql; + var adapter = GetFormatter(connection); + + var sbGetQuery = new StringBuilder($"SELECT * FROM {name} WHERE "); + adapter.AppendColumnName(sbGetQuery, key.Name); + sbGetQuery.Append(" = @id"); + sql = sbGetQuery.ToString(); + GetQueries[typeTuple] = sql; } var dynParams = new DynamicParameters(); @@ -83,13 +92,13 @@ public static Task> GetAllAsync(this IDbConnection connection, var type = typeof(T); var cacheType = typeof(List); - if (!GetQueries.TryGetValue(cacheType.TypeHandle, out string sql)) + if (!GetAllQueries.TryGetValue(cacheType.TypeHandle, out string sql)) { GetSingleKey(nameof(GetAll)); var name = GetTableName(type); sql = "SELECT * FROM " + name; - GetQueries[cacheType.TypeHandle] = sql; + GetAllQueries[cacheType.TypeHandle] = sql; } if (!type.IsInterface) diff --git a/src/Dapper.Contrib/SqlMapperExtensions.cs b/src/Dapper.Contrib/SqlMapperExtensions.cs index 9a30e805..fc20c27a 100644 --- a/src/Dapper.Contrib/SqlMapperExtensions.cs +++ b/src/Dapper.Contrib/SqlMapperExtensions.cs @@ -56,7 +56,11 @@ public interface ITableNameMapper private static readonly ConcurrentDictionary> ExplicitKeyProperties = new ConcurrentDictionary>(); private static readonly ConcurrentDictionary> TypeProperties = new ConcurrentDictionary>(); private static readonly ConcurrentDictionary> ComputedProperties = new ConcurrentDictionary>(); - private static readonly ConcurrentDictionary GetQueries = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary GetAllQueries = new ConcurrentDictionary(); + /// + /// Key is a composite of connection type, entity type + /// + private static readonly ConcurrentDictionary, string> GetQueries = new ConcurrentDictionary, string>(); private static readonly ConcurrentDictionary TypeTableName = new ConcurrentDictionary(); private static readonly ISqlAdapter DefaultAdapter = new SqlServerAdapter(); @@ -171,13 +175,21 @@ public static T Get(this IDbConnection connection, dynamic id, IDbTransaction { var type = typeof(T); - if (!GetQueries.TryGetValue(type.TypeHandle, out string sql)) + // get query caching depends on connection specific formatting + var typeTuple = Tuple.Create(connection.GetType().TypeHandle, type.TypeHandle); + + if (!GetQueries.TryGetValue(typeTuple, out string sql)) { var key = GetSingleKey(nameof(Get)); var name = GetTableName(type); - sql = $"select * from {name} where {key.Name} = @id"; - GetQueries[type.TypeHandle] = sql; + var adapter = GetFormatter(connection); + + var sbGetQuery = new StringBuilder($"SELECT * FROM {name} WHERE "); + adapter.AppendColumnName(sbGetQuery, key.Name); + sbGetQuery.Append(" = @id"); + sql = sbGetQuery.ToString(); + GetQueries[typeTuple] = sql; } var dynParams = new DynamicParameters(); @@ -234,13 +246,13 @@ public static IEnumerable GetAll(this IDbConnection connection, IDbTransac var type = typeof(T); var cacheType = typeof(List); - if (!GetQueries.TryGetValue(cacheType.TypeHandle, out string sql)) + if (!GetAllQueries.TryGetValue(cacheType.TypeHandle, out string sql)) { GetSingleKey(nameof(GetAll)); var name = GetTableName(type); sql = "select * from " + name; - GetQueries[cacheType.TypeHandle] = sql; + GetAllQueries[cacheType.TypeHandle] = sql; } if (!type.IsInterface) return connection.Query(sql, null, transaction, commandTimeout: commandTimeout);