internal static Expression GetInsertExpression(ISyntaxProvider syntax, Expression instance) { InsertCommandExpression insertExp; var entityType = instance.Type; Func <TableExpression, IEnumerable <ColumnAssignment> > func; if (instance is ParameterExpression parExp) { func = new Func <TableExpression, IEnumerable <ColumnAssignment> >(t => GetInsertArguments(syntax, t, parExp)); } else { var entity = instance.As <ConstantExpression>().Value as IEntity; func = new Func <TableExpression, IEnumerable <ColumnAssignment> >(t => GetInsertArguments(syntax, t, entity)); } var metadata = EntityMetadataUnity.GetEntityMetadata(entityType); var table = new TableExpression(new TableAlias(), metadata.TableName, entityType); insertExp = new InsertCommandExpression(table, func(table)) { WithAutoIncrement = !string.IsNullOrEmpty(syntax.IdentitySelect) && HasAutoIncrement(instance.Type) }; return(insertExp); }
protected override Expression VisitInsert(InsertCommandExpression insert) { if (insert.Assignments.Count == 0) { return(Expression.Constant(-1)); } var arguments = VisitColumnAssignments(insert.Assignments); insert = insert.Update(insert.Table, arguments); return(insert.WithAutoIncrement ? BuildExecuteScalarCommand(insert) : BuildExecuteNoQueryCommand(insert)); }
/// <summary> /// 访问 <see cref="InsertCommandExpression"/> 表达式。 /// </summary> /// <param name="insert"></param> /// <returns></returns> protected override Expression VisitInsert(InsertCommandExpression insert) { _isAsync = _isAsync || insert.IsAsync; //如果没有更新参数,则返回-1 if (insert.Assignments.Count == 0) { return(_isAsync ? Expression.Constant(Task.FromResult(-1)) : Expression.Constant(-1)); } var arguments = VisitColumnAssignments(insert.Assignments); insert = insert.Update(insert.Table, arguments); return(insert.WithAutoIncrement ? BuildExecuteScalarCommand(insert) : BuildExecuteNoQueryCommand(insert)); }