public List <T2> ExecuteConstructedGetListStatement <T1, T2>(T1 id, Dictionary <string, object> criteria) { List <T2> results = new List <T2>(); uint statementId = Convert.ToUInt32(id); DbGetListAttribute getList = typeof(T2).GetCustomAttributes(false)?.OfType <DbGetListAttribute>()?.FirstOrDefault(d => d.ConstructedStatementId == statementId); StoredPreparedStatement preparedStatement; if (!preparedStatements.TryGetValue(Convert.ToUInt32(id), out preparedStatement)) { Debug.Assert(preparedStatement != null, "Invalid prepared statement id."); return(null); } try { using (var connection = new MySqlConnection(connectionString)) { using (var command = new MySqlCommand(preparedStatement.Query, connection)) { var properties = GetPropertyCache(typeof(T2)); foreach (var p in properties) { if (getList.ParameterFields.Contains(p.Item2.DbFieldName)) { command.Parameters.Add("", (MySqlDbType)p.Item2.DbFieldType).Value = criteria[p.Item2.DbFieldName]; } } connection.Open(); using (var commandReader = command.ExecuteReader(CommandBehavior.Default)) { while (commandReader.Read()) { T2 o = Activator.CreateInstance <T2>(); foreach (var p in properties) { p.Item1.SetValue(o, commandReader[p.Item2.DbFieldName]); } results.Add(o); } } } } } catch (MySqlException exception) { log.Error($"An exception occured while executing prepared statement {id}!"); log.Error($"Exception: {exception.Message}"); } return(results); }
private void ConstructGetListStatement <T1>(T1 id, Type type) { uint statementId = Convert.ToUInt32(id); DbTableAttribute dbTable = type.GetCustomAttributes(false)?.OfType <DbTableAttribute>()?.FirstOrDefault(); DbGetListAttribute getList = type.GetCustomAttributes(false)?.OfType <DbGetListAttribute>()?.FirstOrDefault(d => d.ConstructedStatementId == statementId); if (dbTable == null) { Debug.Assert(false, $"Statement Construction failed for type {type}"); } if (getList == null) { Debug.Assert(false, $"Statement Construction failed for type {type}"); } List <MySqlDbType> types = new List <MySqlDbType>(); var properties = GetPropertyCache(type); string tableName = getList.TableName; string selectList = null; string whereList = null; foreach (var p in properties) { if (p.Item2.Get) { if (selectList != null) { selectList += ", "; } selectList += "`" + p.Item2.DbFieldName + "`"; } if (getList.ParameterFields.Contains(p.Item2.DbFieldName)) { if (whereList != null) { whereList += " AND "; } whereList += "`" + p.Item2.DbFieldName + "` = ?"; types.Add((MySqlDbType)p.Item2.DbFieldType); } } string query = $"SELECT {selectList} FROM `{tableName}` WHERE {whereList}"; PrepareStatement(statementId, query, types); }