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); } //} }