public virtual T GetById <T>(params object[] keyValues) { OpenConnection(); var type = typeof(T); var tablePath = QueryBuilder.GetMapperTablePath <T>(); var typeMapping = (TarkTypeMapping <T>)TarkConfigurationMapping.ManageMapping <T>(); var mappedKeys = typeMapping.GetMappedOrderedKeys(); if (keyValues.Count() == 0 || mappedKeys.Count() != keyValues.Length) { throw new MissingPrimaryKeyException(); } using (IDbCommand cmd = _connection.CreateCommand()) { StringBuilder cmdFilter = new StringBuilder(); for (int i = 0; i < keyValues.Count(); i++) { cmdFilter.Append($"{ mappedKeys[i] } = @{ mappedKeys[i] } "); if (i != keyValues.Count() - 1) { cmdFilter.Append("AND "); } //Uses ADO Sql Parameters in order to avoid SQL Injection attacks var dbParam = cmd.CreateParameter(); dbParam.ParameterName = $"@{ mappedKeys[i] }"; dbParam.Value = keyValues[i]; if (dbParam.Value is string) { dbParam.DbType = TarkConfigurationMapping.DefaultStringDbType; } cmd.Parameters.Add(dbParam); } cmd.CommandText = $"SELECT * FROM {tablePath} WHERE {cmdFilter.ToString()}"; cmd.CommandType = CommandType.Text; if (IsMockCommand(cmd)) { return(default(T)); } using (IDataReader dr = cmd.ExecuteReader()) { if (dr.Read()) { return(Transformer.CreateObject <T>(dr)); } else { return(default(T)); } } } }