Beispiel #1
0
        private void AddComputedStaticExpression(AddValueContext addContext)
        {
            SqlTableColumn       column           = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name);
            var                  all              = Expression.Call(Expression.Constant(parent.Session.Query), "All", new[] { typeof(T) });
            MethodCallExpression selectExpression = Expression.Call(
                typeof(Queryable),
                "OrderBy",
                addContext.Lambda.Type.GetGenericArguments(),
                all,
                addContext.Lambda);
            QueryTranslationResult request = parent.GetRequest(parent.QueryProvider.CreateQuery <T>(selectExpression));
            var           sqlSelect        = ((SqlSelect)request.Query);
            SqlExpression ex          = sqlSelect.OrderBy[0].Expression;
            var           placeholder = ex as SqlPlaceholder;

            if (placeholder == null)
            {
                parent.Bindings.AddRange(request.ParameterBindings);
                addContext.Statement.AddValue(column, ex);
                return;
            }
            //hack for this case
            addContext.Lambda = (LambdaExpression)addContext.Lambda.Visit((Expression e) =>
            {
                if (e.Type != typeof(Session))
                {
                    return(e);
                }
                return(Expression.Property(addContext.Lambda.Parameters[0], "Session"));
            });
            AddComputedExpression(addContext);
        }
Beispiel #2
0
        private QueryCommand CreateCommand(QueryTranslationResult request)
        {
            var delete = SqlDml.Delete(SqlDml.TableRef(PrimaryIndexes[0].Table));

            Join(delete, (SqlSelect)request.Query);
            return(ToCommand(delete));
        }
Beispiel #3
0
        private QueryCommand CreateCommand(QueryTranslationResult request)
        {
            var update = SqlDml.Update(SqlDml.TableRef(PrimaryIndexes[0].Table));

            setOperation.Statement = SetStatement.Create(update);
            Join(update, (SqlSelect)request.Query);
            setOperation.AddValues();
            return(ToCommand(update));
        }
        protected override int ExecuteInternal()
        {
            base.ExecuteInternal();
            QueryTranslationResult request = GetRequest(query);

            Bindings = request.ParameterBindings.ToList();
            if (PrimaryIndexes.Length > 1)
            {
                throw new NotImplementedException("Inheritance is not implemented");
            }
            SqlDelete delete = SqlDml.Delete(SqlDml.TableRef(PrimaryIndexes[0].Table));

            Join(delete, (SqlSelect)request.Query);
            QueryCommand command = ToCommand(delete);
            int          result  = command.ExecuteNonQuery();

            return(result);
        }
Beispiel #5
0
        protected override int ExecuteInternal()
        {
            base.ExecuteInternal();
            QueryTranslationResult request = GetRequest(query);

            Bindings = request.ParameterBindings.ToList();
            if (PrimaryIndexes.Length > 1)
            {
                throw new NotImplementedException("Inheritance is not implemented");
            }
            SqlUpdate update = SqlDml.Update(SqlDml.TableRef(PrimaryIndexes[0].Table));

            setOperation.Statement = SetStatement.Create(update);
            Join(update, (SqlSelect)request.Query);
            setOperation.AddValues();
            QueryCommand command = ToCommand(update);

            return(command.ExecuteNonQuery());
        }
Beispiel #6
0
        private void AddComputedExpression(AddValueContext addContext)
        {
            SqlTableColumn       column           = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name);
            var                  all              = Expression.Call(Expression.Constant(parent.Session.Query), "All", new[] { typeof(T) });
            MethodCallExpression selectExpression = Expression.Call(
                typeof(Queryable),
                "OrderBy",
                addContext.Lambda.Type.GetGenericArguments(),
                all,
                addContext.Lambda);
            QueryTranslationResult request = parent.GetRequest(parent.QueryProvider.CreateQuery <T>(selectExpression));
            var           sqlSelect        = ((SqlSelect)request.Query);
            SqlExpression ex = sqlSelect.OrderBy[0].Expression;

            parent.Bindings.AddRange(request.ParameterBindings);

            if (parent.JoinedTableRef != null)
            {
                ex.AcceptVisitor(new ComputedExpressionSqlVisitor(sqlSelect.From, parent.JoinedTableRef));
            }

            addContext.Statement.AddValue(column, ex);
        }
Beispiel #7
0
        private void AddEntityValue(AddValueContext addContext)
        {
            if (addContext.EntityParamExists)
            {
                throw new NotSupportedException("Expressions with reference to updating entity are not supported");
            }
            var methodCall = addContext.Descriptor.Expression as MethodCallExpression;
            int i;

            if (methodCall != null)
            {
                if (methodCall.Method.DeclaringType == typeof(QueryEndpoint) &&
                    methodCall.Method.Name.In("Single", "SingleOrDefault"))
                {
                    object[] keys;
                    if (methodCall.Arguments[0].Type == typeof(Key) || methodCall.Arguments[0].Type.IsSubclassOf(typeof(Key)))
                    {
                        var key = (Key)methodCall.Arguments[0].Invoke();
                        keys = new object[key.Value.Count];
                        for (i = 0; i < keys.Length; i++)
                        {
                            keys[i] = key.Value.GetValue(i);
                        }
                    }
                    else
                    {
                        keys = (object[])methodCall.Arguments[0].Invoke();
                    }
                    i = -1;
                    foreach (ColumnInfo column in addContext.Field.Columns)
                    {
                        i++;
                        SqlExpression value;
                        if (keys[i] == null)
                        {
                            value = SqlDml.Null;
                        }
                        else
                        {
                            object v = keys[i];
                            QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(v.GetType(), () => v);
                            parent.Bindings.Add(binding);
                            value = binding.ParameterReference;
                        }
                        SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, column.Name);
                        addContext.Statement.AddValue(c, value);
                    }
                    return;
                }
                if (methodCall.Method.DeclaringType == typeof(Queryable) &&
                    methodCall.Method.Name.In("Single", "SingleOrDefault", "First", "FirstOrDefault"))
                {
                    Expression exp  = methodCall.Arguments[0];
                    TypeInfo   info = parent.GetTypeInfo(addContext.Field.ValueType);
                    if (methodCall.Arguments.Count == 2)
                    {
                        exp = Expression.Call(
                            typeof(Queryable), "Where", new[] { info.UnderlyingType }, exp, methodCall.Arguments[1]);
                    }
                    exp = Expression.Call(typeof(Queryable), "Take", new[] { info.UnderlyingType }, exp, Expression.Constant(1));
                    i   = -1;
                    foreach (FieldInfo field in
                             info.Key.Fields)
                    {
                        i++;
                        ParameterExpression p      = Expression.Parameter(info.UnderlyingType);
                        LambdaExpression    lambda =
                            Expression.Lambda(
                                typeof(Func <,>).MakeGenericType(info.UnderlyingType, field.ValueType),
                                Expression.MakeMemberAccess(p, field.UnderlyingProperty),
                                p);
                        IQueryable q =
                            ((IQueryProvider)parent.QueryProvider).CreateQuery(
                                Expression.Call(typeof(Queryable), "Select", new[] { info.UnderlyingType, field.ValueType }, exp, lambda));
                        QueryTranslationResult request = parent.GetRequest(field.ValueType, q);
                        parent.Bindings.AddRange(request.ParameterBindings);
                        SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Columns[i].Name);
                        addContext.Statement.AddValue(c, SqlDml.SubQuery((ISqlQueryExpression)request.Query));
                    }
                    return;
                }
            }
            i = -1;
            var entity = (IEntity)Expression.Lambda(addContext.Lambda.Body, null).Compile().DynamicInvoke();

            foreach (ColumnInfo column in addContext.Field.Columns)
            {
                i++;
                SqlExpression value;
                if (entity == null)
                {
                    value = SqlDml.Null;
                }
                else
                {
                    object v = entity.Key.Value.GetValue(i);
                    QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(v.GetType(), () => v);
                    parent.Bindings.Add(binding);
                    value = binding.ParameterReference;
                }
                SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, column.Name);
                addContext.Statement.AddValue(c, value);
            }
        }