Пример #1
0
        public override NLinq.Expressions.Expression Visit(NLinq.Expressions.BinaryExpression item)
        {
            switch (item.Type)
            {
                case BinaryExpressionType.And:
                case BinaryExpressionType.Or:
                    return base.Visit(item);
                default:
                    string oldIdentifier = currentIdentifier;
                    currentIdentifier = null;
                    Visit(item.LeftExpression);
                    if (currentIdentifier == null)
                        Visit(item.RightExpression);

                    BinaryExpression constraint;
                    if (!identifiers.TryGetValue(currentIdentifier, out constraint))
                        identifiers[currentIdentifier] = item;
                    else
                        identifiers[currentIdentifier] = new BinaryExpression(BinaryExpressionType.And, constraint, item);
                    return item;
            }
        }
Пример #2
0
        public UpdateStatement Update(Evaluant.Uss.SqlMapper.Mapping.Entity entity)
        {
            UpdateStatement update = new UpdateStatement() { From = new SqlExpressions.FromClause(new TableSourceExpression(null, entity.Table)) };

            foreach (var item in entity.Ids.Values)
            {
                var idConstraint = new BinaryExpression(BinaryExpressionType.Equal, new ColumnExpression(null, item.ColumnName), new DbParameter(item.Name, item.DbType, System.Data.ParameterDirection.Input));

                if (update.Where == null)
                    update.Where = new WhereClause(idConstraint);
                else
                    update.Where.Expression = new BinaryExpression(BinaryExpressionType.And, update.Where.Expression, idConstraint);
            }
            return update;
        }
Пример #3
0
        private void BuildConstraint(Evaluant.Uss.SqlMapper.Mapping.Reference rm, out TableAlias firstAlias)
        {
            BinaryExpression on = null;
            JoinedTableExpression join = null;
            TableAlias lastAlias = null;
            firstAlias = new LazyTableAlias(rm.Rules[0].ParentTable);
            foreach (Mapping.Rule rule in rm.Rules)
            {
                JoinedTableExpression tempJoin = new JoinedTableExpression(new TableSourceExpression(lastAlias ?? firstAlias, rule.ParentTable), new TableSourceExpression(new TableAlias(), rule.ChildTable));

                BinaryExpression tempOn = null;
                for (int i = 0; i < rule.ParentFields.Count; i++)
                {
                    Field parentField = rule.ParentFields[i];
                    Field childField = rule.ChildFields[i];
                    BinaryExpression localOn = new BinaryExpression(BinaryExpressionType.Equal,
                        new ColumnExpression(tempJoin.LeftTable.Alias, parentField.ColumnName),
                        new ColumnExpression(tempJoin.RightTable.Alias, childField.ColumnName));
                    if (tempOn == null)
                        tempOn = localOn;
                    else
                        tempOn = new BinaryExpression(BinaryExpressionType.And, tempOn, localOn);
                }
                tempJoin.On = tempOn;
                if (join != null)
                    tempJoin.LeftTable = join;
                lastAlias = tempJoin.RightTable.Alias;
                join = tempJoin;
                if (on == null)
                    on = tempOn;
                else
                    on = new BinaryExpression(BinaryExpressionType.And, on, tempOn);

            }
            joins[rm] = join;
            ons[rm] = on;
        }
Пример #4
0
        public IDbStatement Create(Mapping.Reference reference, ValuedParameter idParameter)
        {
            //Case of single rule and FK is in the child table
            if (reference.Model.Cardinality.IsOne && reference.Model.Cardinality is Cardinality.ToMany)
            {
                Mapping.Rule rule = reference.Rules[0];
                TableAlias alias = null;
                UpdateStatement update = new UpdateStatement() { From = new Evaluant.Uss.SqlExpressions.FromClause(new TableSourceExpression(alias, rule.ChildTable)) };
                foreach (Field field in rule.ChildFields)
                    update.Set.Add(new ColumnExpression(alias, field.ColumnName), new Evaluant.Uss.SqlExpressions.DbParameter(field.ColumnName.Text, field.DbType, System.Data.ParameterDirection.Input));
                BinaryExpression constraint = null;
                foreach (Mapping.Attribute attribute in reference.Target.Ids.Values)
                {
                    Field field = attribute.Field;
                    BinaryExpression fieldConstraint = new BinaryExpression(BinaryExpressionType.Equal, new ColumnExpression(alias, field.ColumnName), new SqlExpressions.DbParameter(field.ColumnName.Text, field.DbType, System.Data.ParameterDirection.Input));
                    if (constraint == null)
                        constraint = fieldConstraint;
                    else
                        constraint = new BinaryExpression(BinaryExpressionType.And, constraint, fieldConstraint);
                }
                update.Where = new WhereClause(constraint);
                return update;
            }
            //Case of single rule and FK is in the parent table
            if (reference.Model.Cardinality.IsMany && reference.Model.Cardinality is Cardinality.ToOne)
            {
                Mapping.Rule rule = reference.Rules[0];
                TableAlias alias = null;
                UpdateStatement update = new UpdateStatement() { From = new Evaluant.Uss.SqlExpressions.FromClause(new TableSourceExpression(alias, rule.ParentTable)) };
                foreach (Field field in rule.ParentFields)
                    update.Set.Add(new ColumnExpression(alias, field.ColumnName), new Evaluant.Uss.SqlExpressions.DbParameter(field.ColumnName.Text, field.DbType, System.Data.ParameterDirection.Input));
                BinaryExpression constraint = null;
                foreach (Mapping.Attribute attribute in reference.Parent.Ids.Values)
                {
                    Field field = attribute.Field;
                    BinaryExpression fieldConstraint = new BinaryExpression(BinaryExpressionType.Equal, new ColumnExpression(alias, field.ColumnName), new SqlExpressions.DbParameter(field.ColumnName.Text, field.DbType, System.Data.ParameterDirection.Input));
                    if (constraint == null)
                        constraint = fieldConstraint;
                    else
                        constraint = new BinaryExpression(BinaryExpressionType.And, constraint, fieldConstraint);
                }
                update.Where = new WhereClause(constraint);
                return update;
            }
            //Case of 2 rules with an index table
            if (reference.Model.Cardinality.IsMany && reference.Model.Cardinality is Cardinality.ToMany)
            {
                TableAlias alias = null;
                Table indexTable = reference.Rules[0].ChildTable;
                Dictionary<ColumnExpression, Expression> values = new Dictionary<ColumnExpression, Expression>();
                InsertStatement insert = new InsertStatement(new TableSourceExpression(alias, indexTable), values);

                foreach (Mapping.Rule rule in reference.Rules)
                {
                    if (rule.ParentTable == indexTable)
                    {
                        foreach (Field field in rule.ParentFields)
                            values.Add(new ColumnExpression(alias, field.ColumnName), new SqlExpressions.DbParameter(field.ColumnName.Text, field.DbType, System.Data.ParameterDirection.Input));
                    }
                    if (rule.ChildTable == indexTable)
                    {
                        foreach (Field field in rule.ChildFields)
                        {
                            if (field.IsIdentity)

                                values.Add(new ColumnExpression(alias, field.ColumnName), new LazyParameter(field.ColumnName.Text, idParameter, System.Data.ParameterDirection.Input));
                            else
                                values.Add(new ColumnExpression(alias, field.ColumnName), new SqlExpressions.DbParameter(field.ColumnName.Text, field.DbType, System.Data.ParameterDirection.Input));
                        }
                    }
                }
                return insert;
            }
            throw new NotImplementedException();
        }
Пример #5
0
 public NQuery Where(object left, object right, BinaryExpressionType type)
 {
     Expression e = new BinaryExpression(type, new ValueExpression(left, Convert.GetTypeCode(left)), new ValueExpression(right, Convert.GetTypeCode(right)));
     return new NQuery(this, e);
 }