Beispiel #1
0
        public object Execute(Expression expression)
        {
            IDbCommand   cmd = DbProvider.GetCommand();
            SQLPredicate sql = Translate(expression);

            LogQuery(sql.Sql, sql.Parameters);
            cmd.CommandText = sql.Sql;
            sql.SetParameters(cmd);
            // cmd.Connection = DbProvider.Connection; eliminating this because DbProvider already passes its connection to cmd
            try
            {
                IDataReader reader      = cmd.ExecuteReader();
                Type        elementType = TypeSystem.GetElementType(expression.Type);
                //TODO: for select to work properly, we need to identify whether the elementType is an IEnumerable or not
                if (!typeof(IQueryable).IsAssignableFrom(expression.Type))
                {
                    //This is to handle Count method
                    if (elementType == typeof(int))
                    {
                        reader.Read();
                        int result = Convert.ToInt32(reader[0] == DBNull.Value ? 0 : reader[0]);
                        reader.Dispose();
                        return(result);
                    }
                    //Sum method
                    if (elementType == typeof(double))
                    {
                        reader.Read();
                        double result = Convert.ToDouble(reader[0] == DBNull.Value ? 0 : reader[0]);
                        reader.Dispose();
                        return(result);
                    }
                    //Any method
                    if (elementType == typeof(bool))
                    {
                        reader.Read();
                        bool result = Convert.ToBoolean(reader[0]);
                        reader.Dispose();
                        return(result);
                    }
                }
                if (elementType.IsPrimitive || elementType == typeof(string))
                {
                    return(Activator.CreateInstance(
                               typeof(VariableReader <>).MakeGenericType(elementType),
                               BindingFlags.Instance | BindingFlags.NonPublic, null,
                               new object[] { reader },
                               null));
                }
                return(Activator.CreateInstance(
                           typeof(ObjectReader <>).MakeGenericType(elementType),
                           BindingFlags.Instance | BindingFlags.NonPublic, null,
                           new object[] { reader },
                           null));
                //}
            }
            catch (Exception e)
            {
                //TODO: Delete this in oproduction
                throw new Exception(e.Message + "." + " Query: " + cmd.CommandText);
            }
            //}
        }