public void ToDbTest() { var mappingConvention = new MappingConvention( s => s.ToUpper(), s => s, '@' ); var result = mappingConvention.ToDb("a"); Assert.Equal("A", result); }
internal static Query Create(MappingConvention convention) { var insertColumns = string.Join(", ", QueryFactory <T> .InsertPropertyNames.Select(convention.ToDb)); var insertValues = string.Join(", ", InsertPropertyNames.Select(s => $"{convention.Parameter(s)}")); var whereClause = string.Join(" AND ", KeyPropertyNames.Select(s => $"{convention.ToDb(s)} = {convention.Parameter(s)}")); var updateColumns = string.Join(", ", NonKeyPropertyNames.Select(s => $"{convention.ToDb(s)} = {convention.Parameter(s)}")); var allColumns = string.Join(", ", QueryFactory <T> .AllPropertyNames.Select(convention.ToDb)); var tableName = convention.ToDb(typeof(T).Name); return(new Query( $"INSERT INTO {tableName} ({insertColumns}) VALUES ({insertValues})", $"UPDATE {tableName} SET {updateColumns} WHERE {whereClause}", $"DELETE FROM {tableName} WHERE {whereClause}", $"SELECT {allColumns} FROM {tableName} WHERE {whereClause}", $"SELECT {allColumns} FROM {tableName}", $"SELECT COUNT(*) FROM {tableName}")); }
Query(MappingConvention convention) { var properties = typeof(T).GetProperties(); var keyProperties = properties.Where(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(KeyAttribute))).ToArray(); if (!keyProperties.Any()) { keyProperties = properties.Where(p => p.Name.Equals("Id", StringComparison.OrdinalIgnoreCase)).ToArray(); } if (!keyProperties.Any()) { keyProperties = properties.Where(p => p.Name.Equals($"{typeof(T).Name}Id", StringComparison.OrdinalIgnoreCase)).ToArray(); } var dbGenerated = keyProperties.Where(p => p.HasCustomAttribute <DatabaseGeneratedAttribute>(a => a.DatabaseGeneratedOption != DatabaseGeneratedOption.None)); var allPropertyNames = properties.Select(p => convention.ToDb(p.Name)).ToArray(); var insertPropertyNames = properties.Except(dbGenerated).Select(p => p.Name).ToArray(); var keyPropertyNames = keyProperties.Select(p => p.Name).ToArray(); var nonKeyProperties = properties.Except(keyProperties).ToArray(); var nonKeyPropertyNames = nonKeyProperties.Select(p => p.Name).ToArray(); Func <string, string> assign = s => $"{convention.ToDb(s)} = {convention.Parameter(s)}"; var insertColumns = string.Join(", ", insertPropertyNames.Select(convention.ToDb)); var insertValues = string.Join(", ", insertPropertyNames.Select(s => $"{convention.Parameter(s)}")); var whereClause = string.Join(" AND ", keyPropertyNames.Select(assign)); var updateColumns = string.Join(", ", nonKeyPropertyNames.Select(assign)); var allColumns = string.Join(", ", allPropertyNames); var tableName = convention.ToDb(typeof(T).Name); _insert = $"INSERT INTO {tableName} ({insertColumns}) VALUES ({insertValues})"; _delete = $"DELETE FROM {tableName} WHERE {whereClause}"; _update = $"UPDATE {tableName} SET {updateColumns} WHERE {whereClause}"; _select = $"SELECT {allColumns} FROM {tableName} WHERE {whereClause}"; _selectAll = $"SELECT {allColumns} FROM {tableName}"; _count = $"SELECT COUNT(*) FROM {tableName}"; }
internal static IQueryGenerator Create(MappingConvention convention) => new Query <T>(convention);