protected virtual void Insert(IEntityProxy entity, TableAttribute table, ColumnInfoCollection columns) { var values = new ValuesExpression(); var insert = new InsertExpression(new TableExpression(table)) { Values = values }; var type = entity.GetType().BaseType; var discriminator = columns.SingleOrDefault(c => c.IsDiscriminatorColumn); if (discriminator != null) { values.AddColumn(discriminator.ToColumnExpression()); values.AddValue(Expression.Constant(type.FullName)); } foreach (var pi in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { try { var column = columns.SingleOrDefault(c => c.DescribesProperty(pi)); if (column == null) { continue; } var value = pi.GetValue(entity); if (column.IsIdentity) { var defaultValue = Activator.CreateInstance(pi.PropertyType); if (!value.Equals(defaultValue)) { insert.IsIdentityInsertEnabled = true; } else { continue; } } values.AddColumn(column.ToColumnExpression()); values.AddValue(Expression.Constant(value)); } catch (Exception ex) { Debugger.Break(); } } ExecuteNonQuery(insert); }
/* * BNF: * <insert statement> ::= * insert into <table identifier>"("<column identifier commalist>")" * (<values clause> | <query expression>) * * <values clause> ::= * values"("<expression commalist>")" */ protected Statement InsertStatement(Lexer lexer) { lexer.NextToken(); lexer.NextToken().CheckSymbol(Keywords.Into); InsertStatement statement = new InsertStatement(); statement.InsertClause = new InsertClause(); statement.InsertClause.TableExpression = new TableExpression(QualifiedIdentifier(lexer)); lexer.NextToken().CheckSymbol(Keywords.BeginGroup); do { statement.InsertClause.Columns.Add(new InsertFieldExpression(Identifier(lexer))); if (lexer.PeekTokenSymbol(1) == Keywords.ListSeparator) { lexer.NextToken(); } else { break; } } while (true); lexer.NextToken().CheckSymbol(Keywords.EndGroup); if (lexer.PeekTokenSymbol(1) == Keywords.Values) { ValuesExpression values = new ValuesExpression(); lexer.NextToken(); lexer.NextToken().CheckSymbol(Keywords.BeginGroup); do { values.Expressions.Add(Expression(lexer)); if (lexer.PeekTokenSymbol(1) == Keywords.ListSeparator) { lexer.NextToken(); } else { break; } } while (true); lexer.NextToken().CheckSymbol(Keywords.EndGroup); statement.Values = values; } else { lexer.NextToken(); statement.Values = QueryExpression(lexer); } return(statement); }