internal static string BuildGetByIds(IDbConnection connection, Type type, object[] ids, out DynamicParameters parameters) { var sqlBuilder = GetSqlBuilder(connection); var cacheKey = new QueryCacheKey(QueryCacheType.GetByMultipleIds, sqlBuilder, type); if (!QueryCache.TryGetValue(cacheKey, out var sql)) { var tableName = Resolvers.Table(type, sqlBuilder); var keyProperties = Resolvers.KeyProperties(type); var keyColumnNames = keyProperties.Select(p => Resolvers.Column(p.Property, sqlBuilder)).ToArray(); if (keyColumnNames.Length != ids.Length) { throw new InvalidOperationException($"Number of key columns ({keyColumnNames.Length}) of type {type.Name} does not match with the number of specified IDs ({ids.Length})."); } var sb = new StringBuilder("select * from ").Append(tableName).Append(" where"); var i = 0; foreach (var keyColumnName in keyColumnNames) { if (i != 0) { sb.Append(" and"); } sb.Append(" ").Append(keyColumnName).Append($" = {sqlBuilder.PrefixParameter("Id")}").Append(i); i++; } sql = sb.ToString(); QueryCache.TryAdd(cacheKey, sql); } parameters = new DynamicParameters(); for (var i = 0; i < ids.Length; i++) { parameters.Add("Id" + i, ids[i]); } return(sql); }
private static string BuildInsertQuery(IDbConnection connection, Type type) { var sqlBuilder = GetSqlBuilder(connection); var cacheKey = new QueryCacheKey(QueryCacheType.Insert, sqlBuilder, type); if (!QueryCache.TryGetValue(cacheKey, out var sql)) { var tableName = Resolvers.Table(type, connection); var keyProperty = Resolvers.KeyProperty(type, out var isIdentity); var typeProperties = new List <PropertyInfo>(); foreach (var typeProperty in Resolvers.Properties(type)) { if (typeProperty == keyProperty) { if (isIdentity) { // Skip key properties marked as an identity column. continue; } } if (typeProperty.GetSetMethod() != null) { typeProperties.Add(typeProperty); } } var columnNames = typeProperties.Select(p => Resolvers.Column(p, sqlBuilder)).ToArray(); var paramNames = typeProperties.Select(p => "@" + p.Name).ToArray(); sql = sqlBuilder.BuildInsert(tableName, columnNames, paramNames, keyProperty); QueryCache.TryAdd(cacheKey, sql); } return(sql); }
internal static string BuildGetById(ISqlBuilder sqlBuilder, Type type, object id, out DynamicParameters parameters) { var cacheKey = new QueryCacheKey(QueryCacheType.Get, sqlBuilder, type); if (!QueryCache.TryGetValue(cacheKey, out var sql)) { var tableName = Resolvers.Table(type, sqlBuilder); var keyProperties = Resolvers.KeyProperties(type); if (keyProperties.Length > 1) { throw new InvalidOperationException($"Entity {type.Name} contains more than one key property." + "Use the Get<T> overload which supports passing multiple IDs."); } var keyColumnName = Resolvers.Column(keyProperties[0].Property, sqlBuilder); sql = $"select * from {tableName} where {keyColumnName} = {sqlBuilder.PrefixParameter("Id")}"; QueryCache.TryAdd(cacheKey, sql); } parameters = new DynamicParameters(); parameters.Add("Id", id); return sql; }
internal static string BuildUpdateQuery(ISqlBuilder sqlBuilder, Type type) { var cacheKey = new QueryCacheKey(QueryCacheType.Update, sqlBuilder, type); if (!QueryCache.TryGetValue(cacheKey, out var sql)) { var tableName = Resolvers.Table(type, sqlBuilder); var keyProperties = Resolvers.KeyProperties(type); // Use all properties which are settable. var typeProperties = Resolvers.Properties(type) .Except(keyProperties.Where(p => p.IsGenerated).Select(p => p.Property)) .Where(p => p.GetSetMethod() != null) .ToArray(); var columnNames = typeProperties.Select(p => $"{Resolvers.Column(p, sqlBuilder)} = {sqlBuilder.PrefixParameter(p.Name)}").ToArray(); var whereClauses = keyProperties.Select(p => $"{Resolvers.Column(p.Property, sqlBuilder)} = {sqlBuilder.PrefixParameter(p.Property.Name)}"); sql = $"update {tableName} set {string.Join(", ", columnNames)} where {string.Join(" and ", whereClauses)}"; QueryCache.TryAdd(cacheKey, sql); } return(sql); }
private static string BuildUpdateQuery(IDbConnection connection, Type type) { var cacheKey = new QueryCacheKey(QueryCacheType.Update, connection, type); if (!QueryCache.TryGetValue(cacheKey, out var sql)) { var tableName = Resolvers.Table(type, connection); var keyProperty = Resolvers.KeyProperty(type); var builder = GetSqlBuilder(connection); // Use all properties which are settable. var typeProperties = Resolvers.Properties(type) .Where(p => p != keyProperty) .Where(p => p.GetSetMethod() != null) .ToArray(); var columnNames = typeProperties.Select(p => $"{Resolvers.Column(p, connection)} = {builder.PrefixParameter(p.Name)}").ToArray(); sql = $"update {tableName} set {string.Join(", ", columnNames)} where {Resolvers.Column(keyProperty, connection)} = {builder.PrefixParameter(keyProperty.Name)}"; QueryCache.TryAdd(cacheKey, sql); } return(sql); }