Example #1
0
        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));
                    }
                }
            }
        }