Пример #1
0
        /// <inheritdoc/>
        public object Execute(Expression expression)
        {
            PostgresVisitor visitor = new PostgresVisitor();

            visitor.Visit(expression);
            var exp = visitor.ToString();

            return(null);
        }
Пример #2
0
        /// <inheritdoc/>
        public TResult Execute <TResult>(Expression expression)
        {
            Type            tr      = typeof(TResult);
            PostgresVisitor visitor = new PostgresVisitor();

            visitor.Visit(expression);
            var exp = visitor.ToString();

            using (var cmd = this.connection.CreateCommand())
            {
                cmd.CommandText = exp;
                int id = 0;
                foreach (var param in visitor.Parameters)
                {
                    var p = new NpgsqlParameter("p" + (++id), param)
                    {
                        NpgsqlDbType = GetDbType(param.GetType())
                    };
                    cmd.Parameters.Add(p);
                }

                cmd.Prepare();

                using (var reader = cmd.ExecuteReader())
                {
                    if (tr.GenericTypeArguments.Length == 0)
                    {
                        // This is probably a scalar.
                        reader.Read();
                        object value = reader.GetValue(0);
                        if (value is DBNull)
                        {
                            return(default(TResult));
                        }

                        return((TResult)(dynamic)value);
                    }

                    var rowResult = typeof(TResult).GenericTypeArguments[0];

                    if (rowResult == typeof(Transaction))
                    {
                        var results = new List <Transaction>();
                        while (reader.Read())
                        {
                            results.Add(this.MapTransaction(reader));
                        }

                        return((TResult)(object)results);
                    }
                }
            }

            return(default(TResult));
        }