public static ConditionCollection VisitStatementConditions <T>(Expression <Func <T, bool> > conditions, DatabaseMapper mapper, bool aliasTables) { // Build a new query var queryParser = QueryParser.CreateDefault(); var queryExecutor = new StatementExecutor(); var query = new StatementQuery <T>(queryParser, queryExecutor); // Create an expression to select from the query with the conditions so that we have a sequence for Re-Linq to parse var expression = Expression.Call( typeof(Queryable), "Where", new Type[] { query.ElementType }, query.Expression, conditions); // Parse the expression with Re-Linq var queryModel = queryParser.GetParsedQuery(expression); // Get the conditions from the query model var visitor = new StatementCreator(mapper, aliasTables); visitor.SelectStatement = new SelectStatement(); queryModel.Accept(visitor); return(visitor.SelectStatement.Conditions); }
public static SelectStatement Visit(QueryModel queryModel, DatabaseMapper mapper, bool aliasTables) { var visitor = new StatementCreator(mapper, aliasTables); queryModel.Accept(visitor); return(visitor.SelectStatement); }
public override Statement CreateStatement(DatabaseMapper mapper) { var select = new SelectStatement(); select.Source = new Table(mapper.GetTableName(this.Source.Type), this.Source.Alias); select.SourceFields.AddRange(this.SourceFields.Select(s => PropertyToSourceField(s, mapper))); select.SourceFields.AddRange(this.AggregateFields.Select(s => PropertyToAggregate(s, mapper))); select.IsAny = this.IsAny; select.IsAll = this.IsAll; select.IsDistinct = this.IsDistinct; select.StartIndex = this.StartIndex; select.Limit = this.Limit; if (this.Conditions != null) { // TODO: Need to handle columns from multiple tables... var aliasTables = !string.IsNullOrEmpty(this.Source.Alias); foreach (var condition in StatementCreator.VisitStatementConditions(this.Conditions, mapper, aliasTables)) { select.Conditions.Add(condition); } } select.OrderByFields.AddRange(this.OrderByFields.Select(s => PropertyToOrderBy(s, mapper))); select.GroupByFields.AddRange(this.GroupByFields.Select(s => PropertyToGroupBy(s, mapper))); return(select); }
public override Statement CreateStatement(DatabaseMapper mapper) { var delete = new DeleteStatement(); delete.Target = new Table(mapper.GetTableName(this.Target)); foreach (var condition in StatementCreator.VisitStatementConditions(this.Conditions, mapper, false)) { delete.Conditions.Add(condition); } return(delete); }
public UpdateStatement CreateStatement(DatabaseMapper mapper) { var update = new UpdateStatement(); update.Target = new Table(mapper.GetTableName(this.Target)); update.SetValues.AddRange(this.SetValues.Select(sv => new SetValue(new Column(mapper.GetTableName(sv.Item1.DeclaringType), mapper.GetColumnName(sv.Item1)), sv.Item2))); foreach (var condition in StatementCreator.VisitStatementConditions(this.Conditions, mapper, false)) { update.Conditions.Add(condition); } return(update); }
public override Statement CreateStatement(DatabaseMapper mapper) { var update = new UpdateStatement(); update.Target = new Table(mapper.GetTableName(this.Target)); update.SetValues.AddRange(this.SetValues.Select(sv => PropertyToSetValue(sv, mapper))); foreach (var condition in StatementCreator.VisitStatementConditions(this.Conditions, mapper, false)) { update.Conditions.Add(condition); } return(update); }
public SelectStatement CreateStatement(DatabaseMapper mapper) { var select = new SelectStatement(); select.Source = new Table(mapper.GetTableName(this.Source.Type), this.Source.Alias); select.SourceFields.AddRange(this.SourceFields.Select(s => new Column(TableNameOrAlias(mapper, s.DeclaringType), mapper.GetColumnName(s)))); select.SourceFields.AddRange(this.AggregateFields.Select(s => new Aggregate(s.Item2, new Column(s.Item1 != null ? TableNameOrAlias(mapper, s.Item1.DeclaringType) : "", s.Item1 != null ? mapper.GetColumnName(s.Item1) : "*")))); select.IsAny = this.IsAny; select.IsAll = this.IsAll; select.IsDistinct = this.IsDistinct; select.StartIndex = this.StartIndex; select.Limit = this.Limit; if (this.Conditions != null) { // TODO: Need to handle columns from multiple tables... var aliasTables = !string.IsNullOrEmpty(this.Source.Alias); foreach (var condition in StatementCreator.VisitStatementConditions(this.Conditions, mapper, aliasTables)) { select.Conditions.Add(condition); } } select.OrderByFields.AddRange(this.OrderByFields.Select(s => new OrderByExpression(new Column(TableNameOrAlias(mapper, s.Item1.DeclaringType), mapper.GetColumnName(s.Item1)), s.Item2))); return(select); }