コード例 #1
0
        public void ExecuteDeleteTest()
        {
            int?         id         = null;
            ISqlObject   source     = new SqlServerSource(TABLE_NAME);
            DbConnection connection = new SqlConnection(Properties.Settings.Default.SqlConnectionString);

            try {
                ISqlSelectStatement identityStatement = new SqlServerSelectStatement();
                identityStatement.SelectClause.AddExpressions(new SqlFunction("IDENT_CURRENT").AddArgument(new SqlServerExpressionFactory().ConstantFactory.Create(TABLE_NAME)));

                ISqlObject          nameField       = new SqlServerField(source, "Name", null);
                ISqlExpression      name            = SqlStringExpression.FromParameter(new SqlParameter("@name", "Insert Test"));
                ISqlInsertStatement insertStatement = new SqlInsertStatement();
                insertStatement.FieldValueClause.SetSource(source).AddField(nameField, name);
                id = SqlHelper.ExecuteInsert(connection, insertStatement, identityStatement);
            } finally {
                if (id.HasValue)
                {
                    ISqlDeleteStatement deleteStatement = new SqlDeleteStatement();
                    deleteStatement.FromClause.Source     = source;
                    deleteStatement.WhereClause.Condition = new SqlServerField(source, "ID", null).Equal(SqlStringExpression.FromParameter(new SqlParameter("@ID", id.Value)));
                    SqlHelper.ExecuteDelete(connection, deleteStatement);
                }
            }
        }
コード例 #2
0
        public virtual void Visiting(SqlInsertStatement insertStatement)
        {
            insertStatement.SqlInsertClause.Accept(this);
            if (insertStatement.DefaultValues)
            {
                sqlBuilder.Append(" Default Values");
            }
            else
            {
                if (insertStatement.SqlColumnList.Count > 0)
                {
                    sqlBuilder.Append(" (");
                    foreach (SqlColumn sqlColumn in insertStatement.SqlColumnList)
                    {
                        sqlColumn.Accept(this);
                        sqlBuilder.Append(", ");
                    }

                    sqlBuilder.Length -= 2;
                    sqlBuilder.Append(") Values (");
                    foreach (SqlExpression sqlExpression in insertStatement.ValueList)
                    {
                        sqlExpression.Accept(this);
                        sqlBuilder.Append(", ");
                    }
                    sqlBuilder.Length -= 2;
                    sqlBuilder.Append(")");
                }
            }
        }
コード例 #3
0
        public static void MakeAlternativeInsertOrUpdate(Query query)
        {
            var dic = new Dictionary <ICloneableElement, ICloneableElement>();

            var firstStatement = (SqlInsertOrUpdateStatement)query.Queries[0].Statement;
            var cloned         = (SqlInsertOrUpdateStatement)firstStatement.Clone(dic, _ => true);

            var insertStatement = new SqlInsertStatement(cloned.SelectQuery)
            {
                Insert = cloned.Insert
            };

            insertStatement.SelectQuery.From.Tables.Clear();

            query.Queries.Add(new QueryInfo
            {
                Statement  = insertStatement,
                Parameters = query.Queries[0].Parameters
                             .Select(p => new ParameterAccessor
                                     (
                                         p.Expression,
                                         p.Accessor,
                                         p.DataTypeAccessor,
                                         p.DbTypeAccessor,
                                         dic.ContainsKey(p.SqlParameter) ? (SqlParameter)dic[p.SqlParameter] : null
                                     ))
                             .Where(p => p.SqlParameter != null)
                             .ToList(),
            });

            var keys = firstStatement.Update.Keys;

            foreach (var key in keys)
            {
                firstStatement.SelectQuery.Where.Expr(key.Column).Equal.Expr(key.Expression);
            }

            //TODO! looks not working solution
            if (firstStatement.Update.Items.Count > 0)
            {
                query.Queries[0].Statement = new SqlUpdateStatement(firstStatement.SelectQuery)
                {
                    Update = firstStatement.Update
                };
                SetNonQueryQuery2(query);
            }
            else
            {
                firstStatement.SelectQuery.Select.Columns.Clear();
                firstStatement.SelectQuery.Select.Columns.Add(new SqlColumn(firstStatement.SelectQuery, new SqlExpression("1")));
                query.Queries[0].Statement = new SqlSelectStatement(firstStatement.SelectQuery);
                SetQueryQuery2(query);
            }

            query.Queries.Add(new QueryInfo
            {
                Statement  = new SqlSelectStatement(firstStatement.SelectQuery),
                Parameters = query.Queries[0].Parameters.ToList(),
            });
        }
コード例 #4
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));

            var isSubQuery = sequence.SelectQuery.Select.IsDistinct;

            if (isSubQuery)
            {
                sequence = new SubQueryContext(sequence);
            }

            if (!(sequence.Statement is SqlInsertStatement insertStatement))
            {
                insertStatement    = new SqlInsertStatement(sequence.SelectQuery);
                sequence.Statement = insertStatement;
            }

            var insertType = InsertContext.InsertType.Insert;

            switch (methodCall.Method.Name)
            {
            case nameof(LinqExtensions.Insert): insertType = InsertContext.InsertType.Insert;             break;

            case nameof(LinqExtensions.InsertWithIdentity): insertType = InsertContext.InsertType.InsertWithIdentity; break;

            case nameof(LinqExtensions.InsertWithOutput): insertType = InsertContext.InsertType.InsertOutput;       break;

            case nameof(LinqExtensions.InsertWithOutputInto): insertType = InsertContext.InsertType.InsertOutputInto;   break;
            }
コード例 #5
0
 /// <summary>
 /// This is internal API and is not intended for use by Linq To DB applications.
 /// It may change or be removed without further notice.
 /// </summary>
 public static SqlInsertClause?GetInsertClause(this SqlStatement statement)
 {
     return(statement switch
     {
         SqlInsertStatement insert => insert.Insert,
         SqlInsertOrUpdateStatement update => update.Insert,
         _ => null,
     });
コード例 #6
0
            static Query <object> CreateQuery(
                IDataContext dataContext,
                EntityDescriptor descriptor,
                [DisallowNull] T obj,
                InsertColumnFilter <T>?columnFilter,
                string?tableName,
                string?serverName,
                string?databaseName,
                string?schemaName,
                TableOptions tableOptions,
                Type type)
            {
                var sqlTable = new SqlTable(dataContext.MappingSchema, type);

                if (tableName != null)
                {
                    sqlTable.PhysicalName = tableName;
                }
                if (serverName != null)
                {
                    sqlTable.Server = serverName;
                }
                if (databaseName != null)
                {
                    sqlTable.Database = databaseName;
                }
                if (schemaName != null)
                {
                    sqlTable.Schema = schemaName;
                }
                if (tableOptions.IsSet())
                {
                    sqlTable.TableOptions = tableOptions;
                }

                var sqlQuery        = new SelectQuery();
                var insertStatement = new SqlInsertStatement(sqlQuery)
                {
                    Insert = { Into = sqlTable, WithIdentity = true }
                };

                var ei = new Query <object>(dataContext, null)
                {
                    Queries = { new QueryInfo {
                                    Statement = insertStatement,
                                } }
                };

                foreach (var field in sqlTable.Fields.Where(x => columnFilter == null || columnFilter(obj, x.ColumnDescriptor)))
                {
                    if (field.IsInsertable && !field.ColumnDescriptor.ShouldSkip(obj !, descriptor, SkipModification.Insert))
                    {
                        var param = GetParameter(type, dataContext, field);
                        ei.Queries[0].Parameters.Add(param);

                        insertStatement.Insert.Items.Add(new SqlSetExpression(field, param.SqlParameter));
                    }
コード例 #7
0
            static Query <object> CreateQuery(IDataContext dataContext, string tableName, string databaseName, string schemaName, Type type)
            {
                var sqlTable = new SqlTable(dataContext.MappingSchema, type);

                if (tableName != null)
                {
                    sqlTable.PhysicalName = tableName;
                }
                if (databaseName != null)
                {
                    sqlTable.Database = databaseName;
                }
                if (schemaName != null)
                {
                    sqlTable.Schema = schemaName;
                }

                var sqlQuery        = new SelectQuery();
                var insertStatement = new SqlInsertStatement(sqlQuery);

                insertStatement.Insert.Into         = sqlTable;
                insertStatement.Insert.WithIdentity = true;

                var ei = new Query <object>(dataContext, null)
                {
                    Queries = { new QueryInfo {
                                    Statement = insertStatement,
                                } }
                };

                foreach (var field in sqlTable.Fields)
                {
                    if (field.Value.IsInsertable)
                    {
                        var param = GetParameter(type, dataContext, field.Value);

                        ei.Queries[0].Parameters.Add(param);

                        insertStatement.Insert.Items.Add(new SqlSetExpression(field.Value, param.SqlParameter));
                    }
                    else if (field.Value.IsIdentity)
                    {
                        var sqlb = dataContext.CreateSqlProvider();
                        var expr = sqlb.GetIdentityExpression(sqlTable);

                        if (expr != null)
                        {
                            insertStatement.Insert.Items.Add(new SqlSetExpression(field.Value, expr));
                        }
                    }
                }

                SetScalarQuery(ei);

                return(ei);
            }
コード例 #8
0
            static Query <int> CreateQuery(IDataContext dataContext, EntityDescriptor descriptor, T obj, string tableName, string databaseName, string schemaName, Type type)
            {
                var sqlTable = new SqlTable(dataContext.MappingSchema, type);

                if (tableName != null)
                {
                    sqlTable.PhysicalName = tableName;
                }
                if (databaseName != null)
                {
                    sqlTable.Database = databaseName;
                }
                if (schemaName != null)
                {
                    sqlTable.Schema = schemaName;
                }

                var insertStatement = new SqlInsertStatement {
                    Insert = { Into = sqlTable }
                };

                var ei = new Query <int>(dataContext, null)
                {
                    Queries = { new QueryInfo {
                                    Statement = insertStatement
                                } }
                };

                foreach (var field in sqlTable.Fields)
                {
                    if (field.Value.IsInsertable && !field.Value.ColumnDescriptor.ShouldSkip(obj, descriptor, SkipModification.Insert))
                    {
                        var param = GetParameter(type, dataContext, field.Value);
                        ei.Queries[0].Parameters.Add(param);

                        insertStatement.Insert.Items.Add(new SqlSetExpression(field.Value, param.SqlParameter));
                    }
                    else if (field.Value.IsIdentity)
                    {
                        var sqlb = dataContext.CreateSqlProvider();
                        var expr = sqlb.GetIdentityExpression(sqlTable);

                        if (expr != null)
                        {
                            insertStatement.Insert.Items.Add(new SqlSetExpression(field.Value, expr));
                        }
                    }
                }

                SetNonQueryQuery(ei);

                return(ei);
            }
コード例 #9
0
        public void SqlStringTest()
        {
            ISqlObject          source    = new SqlServerSource("Table");
            ISqlObject          field0    = new SqlServerField(source, "ID", null);
            ISqlExpression      value0    = new SqlStringExpression("13");
            ISqlObject          field1    = new SqlServerField(source, "Type", null);
            ISqlExpression      value1    = new SqlStringExpression("14");
            ISqlInsertStatement statement = new SqlInsertStatement();

            statement.FieldValueClause.SetSource(source).AddField(field0, value0).AddField(field1, value1);

            Assert.AreEqual <string>(string.Format("{0} {1}", statement.Keyword, statement.FieldValueClause.SqlString),
                                     statement.SqlString);
        }
コード例 #10
0
            static Query <int> CreateQuery(
                IDataContext dataContext,
                EntityDescriptor descriptor,
                T obj,
                InsertColumnFilter <T>?columnFilter,
                string?tableName,
                string?serverName,
                string?databaseName,
                string?schemaName,
                TableOptions tableOptions,
                Type type)
            {
                var sqlTable = new SqlTable(dataContext.MappingSchema, type);

                if (tableName != null || schemaName != null || databaseName != null || databaseName != null)
                {
                    sqlTable.TableName = new(
                        tableName ?? sqlTable.TableName.Name,
                        Server  : serverName ?? sqlTable.TableName.Server,
                        Database : databaseName ?? sqlTable.TableName.Database,
                        Schema  : schemaName ?? sqlTable.TableName.Schema);
                }

                if (tableOptions.IsSet())
                {
                    sqlTable.TableOptions = tableOptions;
                }

                var insertStatement = new SqlInsertStatement {
                    Insert = { Into = sqlTable }
                };

                var ei = new Query <int>(dataContext, null)
                {
                    Queries = { new QueryInfo {
                                    Statement = insertStatement
                                } }
                };

                foreach (var field in sqlTable.Fields.Where(x => columnFilter == null || columnFilter(obj, x.ColumnDescriptor)))
                {
                    if (field.IsInsertable && !field.ColumnDescriptor.ShouldSkip(obj !, descriptor, SkipModification.Insert))
                    {
                        var param = GetParameter(type, dataContext, field);
                        ei.Queries[0].AddParameterAccessor(param);

                        insertStatement.Insert.Items.Add(new SqlSetExpression(field, param.SqlParameter));
                    }
コード例 #11
0
            protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
            {
                var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
                var extract  = (LambdaExpression)methodCall.Arguments[1].Unwrap();
                var update   = methodCall.Arguments[2].Unwrap();

                if (!(sequence.Statement is SqlInsertStatement insertStatement))
                {
                    insertStatement    = new SqlInsertStatement(sequence.SelectQuery);
                    sequence.Statement = insertStatement;
                }

                if (insertStatement.Insert.Into == null)
                {
                    insertStatement.Insert.Into = (SqlTable)sequence.SelectQuery.From.Tables[0].Source;
                    insertStatement.SelectQuery.From.Tables.Clear();
                }

                if (update.NodeType == ExpressionType.Lambda)
                {
                    var fieldsContext = new TableBuilder.TableContext(builder, new SelectQuery(), insertStatement.Insert.Into);
                    UpdateBuilder.ParseSet(
                        builder,
                        buildInfo,
                        extract,
                        (LambdaExpression)update,
                        fieldsContext,
                        sequence,
                        insertStatement.Insert.Into,
                        insertStatement.Insert.Items);
                }
                else
                {
                    UpdateBuilder.ParseSet(
                        builder,
                        extract,
                        methodCall,
                        2,
                        sequence,
                        insertStatement.Insert.Items);
                }

                insertStatement.Insert.Items.RemoveDuplicatesFromTail((s1, s2) => s1.Column.Equals(s2.Column));

                return(sequence);
            }
コード例 #12
0
            protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
            {
                var source = methodCall.Arguments[0].Unwrap();
                var into   = methodCall.Arguments[1].Unwrap();

                IBuildContext      sequence;
                SqlInsertStatement insertStatement;

                // static IValueInsertable<T> Into<T>(this IDataContext dataContext, Table<T> target)
                //
                if (source.NodeType == ExpressionType.Constant && ((ConstantExpression)source).Value == null)
                {
                    sequence = builder.BuildSequence(new BuildInfo((IBuildContext?)null, into, new SelectQuery()));

                    if (sequence.SelectQuery.Select.IsDistinct)
                    {
                        sequence = new SubQueryContext(sequence);
                    }

                    insertStatement             = new SqlInsertStatement(sequence.SelectQuery);
                    insertStatement.Insert.Into = ((TableBuilder.TableContext)sequence).SqlTable;
                    insertStatement.SelectQuery.From.Tables.Clear();
                }
                // static ISelectInsertable<TSource,TTarget> Into<TSource,TTarget>(this IQueryable<TSource> source, Table<TTarget> target)
                //
                else
                {
                    sequence = builder.BuildSequence(new BuildInfo(buildInfo, source));

                    if (sequence.SelectQuery.Select.IsDistinct)
                    {
                        sequence = new SubQueryContext(sequence);
                    }

                    insertStatement = new SqlInsertStatement(sequence.SelectQuery);

                    var tbl = builder.BuildSequence(new BuildInfo((IBuildContext?)null, into, new SelectQuery()));
                    insertStatement.Insert.Into = ((TableBuilder.TableContext)tbl).SqlTable;
                }

                sequence.Statement = insertStatement;
                sequence.SelectQuery.Select.Columns.Clear();

                return(sequence);
            }
コード例 #13
0
        public void StatementAsExpected()
        {
            var dataType       = "SqlUnitTestObject1";
            var createdTimeUtc = DateTime.Parse("2019-08-27 01:02:03");
            var container      = new GenericDataContainer(
                "1234",
                "jdoe",
                createdTimeUtc,
                "jdoe",
                createdTimeUtc,
                ApiVersion.Current,
                DataEncoder.Encode(JsonConvert.SerializeObject(new { Name = "Doe", Age = 101.4, TimeUtc = createdTimeUtc })));
            var actual   = SqlInsertStatement.CreateFromContainer(dataType, container);
            var expected = $"INSERT INTO {dataType} (Id, OriginalSubmitter, CreatedTimeUtc, Submitter, SubmissionTimeUtc, Data#Name, Data#Age, Data#TimeUtc) "
                           + "VALUES ('1234', 'jdoe', '2019-08-27 01:02:03', 'jdoe', '2019-08-27 01:02:03', 'Doe', '101.4', '2019-08-27 01:02:03')";

            Assert.That(actual, Is.EqualTo(expected));
        }
コード例 #14
0
            protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
            {
                var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
                var extract  = (LambdaExpression)methodCall.Arguments[1].Unwrap();
                var update   = methodCall.Arguments[2].Unwrap();

                if (!(sequence.Statement is SqlInsertStatement insertStatement))
                {
                    insertStatement    = new SqlInsertStatement(sequence.SelectQuery);
                    sequence.Statement = insertStatement;
                }

                if (insertStatement.Insert.Into == null)
                {
                    insertStatement.Insert.Into = (SqlTable)sequence.SelectQuery.From.Tables[0].Source;
                    insertStatement.SelectQuery.From.Tables.Clear();
                }

                if (update.NodeType == ExpressionType.Lambda)
                {
                    UpdateBuilder.ParseSet(
                        builder,
                        buildInfo,
                        extract,
                        (LambdaExpression)update,
                        sequence,
                        insertStatement.Insert.Into,
                        insertStatement.Insert.Items);
                }
                else
                {
                    UpdateBuilder.ParseSet(
                        builder,
                        buildInfo,
                        extract,
                        update,
                        sequence,
                        insertStatement.Insert.Items);
                }

                return(sequence);
            }
コード例 #15
0
        public void Execute(Dictionary <string, Table> tables, SqlInsertStatement insertStatement)
        {
            var spec    = insertStatement.Children.First( ) as SqlInsertSpecification;
            var table   = GetInsertTable(tables, spec);
            var columns = GetInsertColumns(spec, table);

            switch (spec.Source)
            {
            case SqlTableConstructorInsertSource tableSource:
                AddRowFromTableConstructor(table, columns, tableSource);
                break;

            case SqlSelectSpecificationInsertSource selectSource:
                AddRowsFromSelect(table, columns, selectSource);
                break;

            default:
                throw new NotImplementedException($"Not implemented for insert source {spec.Source.GetType(  ) }");
            }
        }
コード例 #16
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));

            var isSubQuery = sequence.SelectQuery.Select.IsDistinct;

            if (isSubQuery)
            {
                sequence = new SubQueryContext(sequence);
            }

            if (!(sequence.Statement is SqlInsertStatement insertStatement))
            {
                insertStatement    = new SqlInsertStatement(sequence.SelectQuery);
                sequence.Statement = insertStatement;
            }

            var insertType = InsertContext.InsertType.Insert;

            switch (methodCall.Method.Name)
            {
            case "Insert": insertType = InsertContext.InsertType.Insert;             break;

            case "InsertWithIdentity": insertType = InsertContext.InsertType.InsertWithIdentity; break;

            case "InsertWithOutput": insertType = InsertContext.InsertType.InsertOutput;       break;

            case "InsertWithOutputInto": insertType = InsertContext.InsertType.InsertOutputInto;   break;
            }

            var indexedParameters
                = methodCall.Method.GetParameters().Select((p, i) => Tuple.Create(p, i)).ToDictionary(t => t.Item1.Name, t => t.Item2);

            Expression GetArgumentByName(string name)
            {
                return(methodCall.Arguments[indexedParameters[name]]);
            }

            LambdaExpression GetOutputExpression(Type outputType)
            {
                if (!indexedParameters.TryGetValue("outputExpression", out var index))
                {
                    var param = Expression.Parameter(outputType);
                    return(Expression.Lambda(param, param));
                }

                return((LambdaExpression)methodCall.Arguments[index].Unwrap());
            }

            IBuildContext?   outputContext    = null;
            LambdaExpression?outputExpression = null;

            if (methodCall.Arguments.Count > 0)
            {
                var argument = methodCall.Arguments[0];
                if (typeof(IValueInsertable <>).IsSameOrParentOf(argument.Type) ||
                    typeof(ISelectInsertable <,>).IsSameOrParentOf(argument.Type))
                {
                    // static int Insert<T>              (this IValueInsertable<T> source)
                    // static int Insert<TSource,TTarget>(this ISelectInsertable<TSource,TTarget> source)

                    sequence.SelectQuery.Select.Columns.Clear();
                    foreach (var item in insertStatement.Insert.Items)
                    {
                        sequence.SelectQuery.Select.ExprNew(item.Expression !);
                    }
                }
                else if (methodCall.Arguments.Count > 1 &&
                         typeof(IQueryable <>).IsSameOrParentOf(argument.Type) &&
                         typeof(ITable <>).IsSameOrParentOf(methodCall.Arguments[1].Type))
                {
                    // static int Insert<TSource,TTarget>(this IQueryable<TSource> source, Table<TTarget> target, Expression<Func<TSource,TTarget>> setter)

                    var into   = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SelectQuery()));
                    var setter = (LambdaExpression)GetArgumentByName("setter").Unwrap();

                    UpdateBuilder.BuildSetter(
                        builder,
                        buildInfo,
                        setter,
                        into,
                        insertStatement.Insert.Items,
                        sequence);

                    sequence.SelectQuery.Select.Columns.Clear();

                    foreach (var item in insertStatement.Insert.Items)
                    {
                        sequence.SelectQuery.Select.Columns.Add(new SqlColumn(sequence.SelectQuery, item.Expression !));
                    }

                    insertStatement.Insert.Into = ((TableBuilder.TableContext)into).SqlTable;
                }
                else if (typeof(ITable <>).IsSameOrParentOf(argument.Type))
                {
                    // static int Insert<T>(this Table<T> target, Expression<Func<T>> setter)
                    // static TTarget InsertWithOutput<TTarget>(this ITable<TTarget> target, Expression<Func<TTarget>> setter)
                    // static TTarget InsertWithOutput<TTarget>(this ITable<TTarget> target, Expression<Func<TTarget>> setter, Expression<Func<TTarget,TOutput>> outputExpression)
                    var argIndex            = 1;
                    var arg                 = methodCall.Arguments[argIndex].Unwrap();
                    LambdaExpression?setter = null;
                    switch (arg)
                    {
                    case LambdaExpression lambda:
                    {
                        setter = lambda;

                        UpdateBuilder.BuildSetter(
                            builder,
                            buildInfo,
                            setter,
                            sequence,
                            insertStatement.Insert.Items,
                            sequence);

                        break;
                    }

                    default:
                    {
                        var objType = arg.Type;

                        var ed   = builder.MappingSchema.GetEntityDescriptor(objType);
                        var into = sequence;
                        var ctx  = new TableBuilder.TableContext(builder, buildInfo, objType);

                        var table = new SqlTable(objType);

                        foreach (ColumnDescriptor c in ed.Columns.Where(c => !c.SkipOnInsert))
                        {
                            if (!table.Fields.TryGetValue(c.ColumnName, out var field))
                            {
                                continue;
                            }

                            var pe = Expression.MakeMemberAccess(arg, c.MemberInfo);

                            var column    = into.ConvertToSql(pe, 1, ConvertFlags.Field);
                            var parameter = builder.BuildParameterFromArgumentProperty(methodCall, argIndex, field.ColumnDescriptor);

                            insertStatement.Insert.Items.Add(new SqlSetExpression(column[0].Sql, parameter.SqlParameter));
                        }

                        var insertedTable = SqlTable.Inserted(methodCall.Method.GetGenericArguments()[0]);

                        break;
                    }
                    }

                    insertStatement.Insert.Into = ((TableBuilder.TableContext)sequence).SqlTable;
                    sequence.SelectQuery.From.Tables.Clear();
                }

                if (insertType == InsertContext.InsertType.InsertOutput || insertType == InsertContext.InsertType.InsertOutputInto)
                {
                    outputExpression = GetOutputExpression(methodCall.Method.GetGenericArguments().Last());

                    insertStatement.Output = new SqlOutputClause();

                    var insertedTable = SqlTable.Inserted(outputExpression.Parameters[0].Type);

                    outputContext = new TableBuilder.TableContext(builder, new SelectQuery(), insertedTable);

                    insertStatement.Output.InsertedTable = insertedTable;

                    if (insertType == InsertContext.InsertType.InsertOutputInto)
                    {
                        var outputTable = GetArgumentByName("outputTable");
                        var destination = builder.BuildSequence(new BuildInfo(buildInfo, outputTable, new SelectQuery()));

                        UpdateBuilder.BuildSetter(
                            builder,
                            buildInfo,
                            outputExpression,
                            destination,
                            insertStatement.Output.OutputItems,
                            outputContext);

                        insertStatement.Output.OutputTable = ((TableBuilder.TableContext)destination).SqlTable;
                    }
                }
            }

            var insert = insertStatement.Insert;

            var q = insert.Into !.Fields.Values
                    .Except(insert.Items.Select(e => e.Column))
                    .OfType <SqlField>()
                    .Where(f => f.IsIdentity);

            foreach (var field in q)
            {
                var expr = builder.DataContext.CreateSqlProvider().GetIdentityExpression(insert.Into);

                if (expr != null)
                {
                    insert.Items.Insert(0, new SqlSetExpression(field, expr));

                    if (methodCall.Arguments.Count == 3)
                    {
                        sequence.SelectQuery.Select.Columns.Insert(0, new SqlColumn(sequence.SelectQuery, insert.Items[0].Expression !));
                    }
                }
            }

            insertStatement.Insert.WithIdentity = insertType == InsertContext.InsertType.InsertWithIdentity;
            sequence.Statement = insertStatement;

            if (insertType == InsertContext.InsertType.InsertOutput)
            {
                return(new InsertWithOutputContext(buildInfo.Parent, sequence, outputContext !, outputExpression !));
            }

            return(new InsertContext(buildInfo.Parent, sequence, insertType, outputExpression));
        }
コード例 #17
0
 public override void Visit(SqlInsertStatement codeObject)
 {
 }
コード例 #18
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));

            var isSubQuery = sequence.SelectQuery.Select.IsDistinct;

            if (isSubQuery)
            {
                sequence = new SubQueryContext(sequence);
            }

            if (!(sequence.Statement is SqlInsertStatement insertStatement))
            {
                insertStatement    = new SqlInsertStatement(sequence.SelectQuery);
                sequence.Statement = insertStatement;
            }

            switch (methodCall.Arguments.Count)
            {
            case 1:
                // static int Insert<T>              (this IValueInsertable<T> source)
                // static int Insert<TSource,TTarget>(this ISelectInsertable<TSource,TTarget> source)
            {
                foreach (var item in insertStatement.Insert.Items)
                {
                    sequence.SelectQuery.Select.Expr(item.Expression);
                }
                break;
            }

            case 2:                      // static int Insert<T>(this Table<T> target, Expression<Func<T>> setter)
            {
                UpdateBuilder.BuildSetter(
                    builder,
                    buildInfo,
                    (LambdaExpression)methodCall.Arguments[1].Unwrap(),
                    sequence,
                    insertStatement.Insert.Items,
                    sequence);

                insertStatement.Insert.Into = ((TableBuilder.TableContext)sequence).SqlTable;
                sequence.SelectQuery.From.Tables.Clear();

                break;
            }

            case 3:                      // static int Insert<TSource,TTarget>(this IQueryable<TSource> source, Table<TTarget> target, Expression<Func<TSource,TTarget>> setter)
            {
                var into = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SelectQuery()));

                UpdateBuilder.BuildSetter(
                    builder,
                    buildInfo,
                    (LambdaExpression)methodCall.Arguments[2].Unwrap(),
                    into,
                    insertStatement.Insert.Items,
                    sequence);

                sequence.SelectQuery.Select.Columns.Clear();

                foreach (var item in insertStatement.Insert.Items)
                {
                    sequence.SelectQuery.Select.Columns.Add(new SqlColumn(sequence.SelectQuery, item.Expression));
                }

                insertStatement.Insert.Into = ((TableBuilder.TableContext)into).SqlTable;

                break;
            }
            }

            var insert = insertStatement.Insert;

            var q = insert.Into.Fields.Values
                    .Except(insert.Items.Select(e => e.Column))
                    .OfType <SqlField>()
                    .Where(f => f.IsIdentity);

            foreach (var field in q)
            {
                var expr = builder.DataContext.CreateSqlProvider().GetIdentityExpression(insert.Into);

                if (expr != null)
                {
                    insert.Items.Insert(0, new SqlSetExpression(field, expr));

                    if (methodCall.Arguments.Count == 3)
                    {
                        sequence.SelectQuery.Select.Columns.Insert(0, new SqlColumn(sequence.SelectQuery, insert.Items[0].Expression));
                    }
                }
            }

            insertStatement.Insert.WithIdentity = methodCall.Method.Name == "InsertWithIdentity";
            sequence.Statement = insertStatement;

            return(new InsertContext(buildInfo.Parent, sequence, insertStatement.Insert.WithIdentity));
        }
コード例 #19
0
            protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
            {
                var source = methodCall.Arguments[0].Unwrap();
                var into   = methodCall.Arguments[1].Unwrap();

                IBuildContext      sequence;
                IBuildContext      destinationSequence;
                SqlInsertStatement insertStatement;

                // static IValueInsertable<T> Into<T>(this IDataContext dataContext, Table<T> target)
                //
                if (source.NodeType == ExpressionType.Constant && ((ConstantExpression)source).Value == null)
                {
                    sequence            = builder.BuildSequence(new BuildInfo((IBuildContext?)null, into, new SelectQuery()));
                    destinationSequence = sequence;

                    if (sequence.SelectQuery.Select.IsDistinct)
                    {
                        sequence = new SubQueryContext(sequence);
                    }

                    insertStatement             = new SqlInsertStatement(sequence.SelectQuery);
                    insertStatement.Insert.Into = ((TableBuilder.TableContext)sequence).SqlTable;
                    insertStatement.SelectQuery.From.Tables.Clear();
                }
                // static ISelectInsertable<TSource,TTarget> Into<TSource,TTarget>(this IQueryable<TSource> source, Table<TTarget> target)
                //
                else
                {
                    sequence            = builder.BuildSequence(new BuildInfo(buildInfo, source));
                    destinationSequence = builder.BuildSequence(new BuildInfo((IBuildContext?)null, into, new SelectQuery()));

                    if (sequence.SelectQuery.Select.IsDistinct)
                    {
                        sequence = new SubQueryContext(sequence);
                    }

                    var destinationTable = ((TableBuilder.TableContext)destinationSequence).SqlTable;

                    insertStatement             = new SqlInsertStatement(sequence.SelectQuery);
                    insertStatement.Insert.Into = destinationTable;
                }

                // generating default items
                var matched = MatchSequences(sequence, destinationSequence);

                foreach (var tuple in matched)
                {
                    var field = QueryHelper.GetUnderlyingField(tuple.Item2.Sql);
                    if (field == null || field.ColumnDescriptor.SkipOnInsert)
                    {
                        continue;
                    }
                    insertStatement.Insert.DefaultItems.Add(new SqlSetExpression(field, tuple.Item1.Sql));
                }

                sequence.Statement = insertStatement;
                sequence.SelectQuery.Select.Columns.Clear();

                return(sequence);
            }
コード例 #20
0
 public virtual void Visited(SqlInsertStatement insertStatement)
 {
 }
コード例 #21
0
 public SqlInsertStatementFormatter(FormatterVisitor visitor, SqlInsertStatement codeObject)
     : base(visitor, codeObject, false)
 {
 }