public override DbExpression Visit(DbJoinTableExpression exp) { DbJoinTableExpression joinTablePart = exp; string joinString = null; if (joinTablePart.JoinType == DbJoinType.InnerJoin) { joinString = " INNER JOIN "; } else if (joinTablePart.JoinType == DbJoinType.LeftJoin) { joinString = " LEFT JOIN "; } else if (joinTablePart.JoinType == DbJoinType.RightJoin) { joinString = " RIGHT JOIN "; } else if (joinTablePart.JoinType == DbJoinType.FullJoin) { joinString = " FULL JOIN "; } else { throw new NotSupportedException("JoinType: " + joinTablePart.JoinType); } this._sqlBuilder.Append(joinString); this.AppendTableSegment(joinTablePart.Table); this._sqlBuilder.Append(" ON "); JoinConditionExpressionParser.Parse(joinTablePart.Condition).Accept(this); this.VisitDbJoinTableExpressions(joinTablePart.JoinTables); return(exp); }
public virtual JoinQueryResult ToJoinQueryResult(DbJoinType joinType, LambdaExpression conditionExpression, DbFromTableExpression fromTable, List <IMappingObjectExpression> moeList, string tableAlias) { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); string alias = tableAlias; DbTableSegment tableSeg = new DbTableSegment(subQuery, alias); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); List <IMappingObjectExpression> moes = new List <IMappingObjectExpression>(moeList.Count + 1); moes.AddRange(moeList); moes.Add(newMoe); DbExpression condition = GeneralExpressionVisitor.ParseLambda(conditionExpression, moes); DbJoinTableExpression joinTable = new DbJoinTableExpression(joinType, tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = newMoe; result.JoinTable = joinTable; return(result); }
ComplexObjectModel GenComplexObjectModel(ComplexPropertyDescriptor navigationDescriptor, NavigationNode navigationNode, QueryModel queryModel) { TypeDescriptor navigationTypeDescriptor = EntityTypeContainer.GetDescriptor(navigationDescriptor.PropertyType); DbTable dbTable = navigationTypeDescriptor.Table; DbTableExpression tableExp = new DbTableExpression(dbTable); string alias = queryModel.GenerateUniqueTableAlias(dbTable.Name); DbTableSegment joinTableSeg = new DbTableSegment(tableExp, alias, queryModel.FromTable.Table.Lock); DbTable aliasTable = new DbTable(alias); ComplexObjectModel navigationObjectModel = navigationTypeDescriptor.GenObjectModel(aliasTable); navigationObjectModel.NullChecking = navigationObjectModel.PrimaryKey; PrimitivePropertyDescriptor foreignKeyPropertyDescriptor = navigationDescriptor.ForeignKeyProperty; DbExpression foreignKeyColumn = this.GetPrimitiveMember(foreignKeyPropertyDescriptor.Property); DbExpression joinCondition = DbExpression.Equal(foreignKeyColumn, navigationObjectModel.PrimaryKey); DbJoinTableExpression joinTableExp = new DbJoinTableExpression(foreignKeyPropertyDescriptor.IsNullable ? DbJoinType.LeftJoin : DbJoinType.InnerJoin, joinTableSeg, joinCondition); this.DependentTable.JoinTables.Add(joinTableExp); navigationObjectModel.DependentTable = joinTableExp; DbExpression condition = this.ParseCondition(navigationNode.Condition, navigationObjectModel, queryModel.ScopeTables); //AndWhere的条件放到join条件里去 joinTableExp.AppendCondition(condition); navigationObjectModel.Filter = this.ParseCondition(navigationNode.Filter, navigationObjectModel, queryModel.ScopeTables); //queryModel.Filters.Add(navigationObjectModel.Filter); return(navigationObjectModel); }
public override JoinQueryResult Visit(RootQueryExpression exp) { Type type = exp.ElementType; TypeDescriptor typeDescriptor = EntityTypeContainer.GetDescriptor(type); string explicitTableName = exp.ExplicitTable; DbTable dbTable = typeDescriptor.Table; if (explicitTableName != null) { dbTable = new DbTable(explicitTableName, dbTable.Schema); } string alias = this._queryModel.GenerateUniqueTableAlias(dbTable.Name); DbTableSegment tableSeg = CreateTableSegment(dbTable, alias, exp.Lock); DbTable aliasTable = new DbTable(alias); ComplexObjectModel model = typeDescriptor.GenObjectModel(aliasTable); //TODO 解析 on 条件表达式 var scopeParameters = this._scopeParameters.Clone(this._conditionExpression.Parameters.Last(), model); DbExpression condition = GeneralExpressionParser.Parse(this._conditionExpression, scopeParameters, this._queryModel.ScopeTables); DbJoinTableExpression joinTable = new DbJoinTableExpression(this._joinType.AsDbJoinType(), tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.ResultModel = model; result.JoinTable = joinTable; return(result); }
void SetupFilters() { DbJoinTableExpression joinTableExpression = this.DependentTable as DbJoinTableExpression; if (joinTableExpression != null) { this.Filters.ForEach(a => { joinTableExpression.Condition = joinTableExpression.Condition.And(a); }); } }
public override JoinQueryResult Visit(RootQueryExpression exp) { Type type = exp.ElementType; TypeDescriptor typeDescriptor = TypeDescriptor.GetDescriptor(type); string explicitTableName = exp.ExplicitTable; DbTable dbTable = typeDescriptor.Table; if (explicitTableName != null) { dbTable = new DbTable(explicitTableName, dbTable.Schema); } string alias = this._resultElement.GenerateUniqueTableAlias(dbTable.Name); DbTableSegment tableSeg = CreateTableExpression(dbTable, alias); MappingObjectExpression moe = new MappingObjectExpression(typeDescriptor.EntityType.GetConstructor(Type.EmptyTypes)); DbTable table = new DbTable(alias); foreach (MappingMemberDescriptor item in typeDescriptor.MappingMemberDescriptors.Values) { DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(table, item.Column); moe.AddMemberExpression(item.MemberInfo, columnAccessExpression); if (item.IsPrimaryKey) { moe.PrimaryKey = columnAccessExpression; } } //TODO 解析 on 条件表达式 DbExpression condition = null; List <IMappingObjectExpression> moeList = new List <IMappingObjectExpression>(this._moeList.Count + 1); moeList.AddRange(this._moeList); moeList.Add(moe); condition = GeneralExpressionVisitor.ParseLambda(this._conditionExpression, moeList); DbJoinTableExpression joinTable = new DbJoinTableExpression(this._joinType, tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = moe; result.JoinTable = joinTable; return(result); }
static bool ExistTableAlias(DbJoinTableExpression joinTable, string alias) { if (string.Equals(joinTable.Table.Alias, alias, StringComparison.OrdinalIgnoreCase)) { return(true); } foreach (var item in joinTable.JoinTables) { if (ExistTableAlias(item, alias)) { return(true); } } return(false); }
ComplexObjectModel GenCollectionElementObjectModel(TypeDescriptor elementTypeDescriptor, NavigationNode navigationNode, QueryModel queryModel) { DbTable dbTable = elementTypeDescriptor.Table; DbTableExpression tableExp = new DbTableExpression(dbTable); string alias = queryModel.GenerateUniqueTableAlias(dbTable.Name); DbTableSegment joinTableSeg = new DbTableSegment(tableExp, alias, queryModel.FromTable.Table.Lock); DbTable aliasTable = new DbTable(alias); ComplexObjectModel elementObjectModel = elementTypeDescriptor.GenObjectModel(aliasTable); elementObjectModel.NullChecking = elementObjectModel.PrimaryKey; ComplexPropertyDescriptor navigationDescriptor = elementTypeDescriptor.ComplexPropertyDescriptors.Where(a => a.PropertyType == this.ObjectType).FirstOrDefault(); if (navigationDescriptor == null) { throw new ChloeException($"You have to define a navigation property which type is '{this.ObjectType.FullName}' on class '{elementTypeDescriptor.Definition.Type.FullName}'."); } DbExpression elementForeignKeyColumn = elementObjectModel.GetPrimitiveMember(navigationDescriptor.ForeignKeyProperty.Property); DbExpression joinCondition = DbExpression.Equal(this.PrimaryKey, elementForeignKeyColumn); DbJoinTableExpression joinTableExp = new DbJoinTableExpression(DbJoinType.LeftJoin, joinTableSeg, joinCondition); this.DependentTable.JoinTables.Add(joinTableExp); elementObjectModel.DependentTable = joinTableExp; var condition = this.ParseCondition(navigationNode.Condition, elementObjectModel, queryModel.ScopeTables); //AndWhere的条件放到join条件里去 joinTableExp.AppendCondition(condition); elementObjectModel.Filter = this.ParseCondition(navigationNode.Filter, elementObjectModel, queryModel.ScopeTables); bool orderByPrimaryKeyExists = queryModel.Orderings.Where(a => a.Expression == this.PrimaryKey).Any(); if (!orderByPrimaryKeyExists) { //结果集分组 DbOrdering ordering = new DbOrdering(this.PrimaryKey, DbOrderType.Asc); queryModel.Orderings.Add(ordering); } //queryModel.Filters.Add(elementObjectModel.Filter); return(elementObjectModel); }
public override JoinQueryResult ToJoinQueryResult(JoinType joinType, LambdaExpression conditionExpression, ScopeParameterDictionary scopeParameters, StringSet scopeTables, Func <string, string> tableAliasGenerator) { scopeParameters = scopeParameters.Clone(conditionExpression.Parameters.Last(), this.QueryModel.ResultModel); DbExpression condition = GeneralExpressionParser.Parse(conditionExpression, scopeParameters, scopeTables); DbJoinTableExpression joinTable = new DbJoinTableExpression(joinType.AsDbJoinType(), this.QueryModel.FromTable.Table, condition); if (!this.QueryModel.IgnoreFilters) { joinTable.Condition = joinTable.Condition.And(this.QueryModel.ContextFilters).And(this.QueryModel.GlobalFilters); } JoinQueryResult result = new JoinQueryResult(); result.ResultModel = this.QueryModel.ResultModel; result.JoinTable = joinTable; return(result); }
public override JoinQueryResult Visit(RootQueryExpression exp) { Type type = exp.ElementType; TypeDescriptor typeDescriptor = EntityTypeContainer.GetDescriptor(type); string explicitTableName = exp.ExplicitTable; DbTable dbTable = typeDescriptor.Table; if (explicitTableName != null) { dbTable = new DbTable(explicitTableName, dbTable.Schema); } string alias = this._resultElement.GenerateUniqueTableAlias(dbTable.Name); DbTableSegment tableSeg = CreateTableSegment(dbTable, alias, exp.Lock); MappingObjectExpression moe = new MappingObjectExpression(typeDescriptor.Definition.Type.GetConstructor(Type.EmptyTypes)); DbTable table = new DbTable(alias); foreach (PropertyDescriptor item in typeDescriptor.PropertyDescriptors) { DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(table, item.Column); moe.AddMappingMemberExpression(item.Property, columnAccessExpression); if (item.IsPrimaryKey) { moe.PrimaryKey = columnAccessExpression; } } //TODO 解析 on 条件表达式 var scopeParameters = this._scopeParameters.Clone(this._conditionExpression.Parameters.Last(), moe); DbExpression condition = GeneralExpressionParser.Parse(this._conditionExpression, scopeParameters, this._resultElement.ScopeTables); DbJoinTableExpression joinTable = new DbJoinTableExpression(this._joinType.AsDbJoinType(), tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = moe; result.JoinTable = joinTable; return(result); }
public virtual JoinQueryResult ToJoinQueryResult(JoinType joinType, LambdaExpression conditionExpression, ScopeParameterDictionary scopeParameters, KeyDictionary<string> scopeTables, string tableAlias) { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); string alias = tableAlias; DbTableSegment tableSeg = new DbTableSegment(subQuery, alias); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); scopeParameters[conditionExpression.Parameters[conditionExpression.Parameters.Count - 1]] = newMoe; DbExpression condition = GeneralExpressionVisitor.ParseLambda(conditionExpression, scopeParameters, scopeTables); DbJoinTableExpression joinTable = new DbJoinTableExpression(joinType.AsDbJoinType(), tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = newMoe; result.JoinTable = joinTable; return result; }
public virtual JoinQueryResult ToJoinQueryResult(JoinType joinType, LambdaExpression conditionExpression, ScopeParameterDictionary scopeParameters, StringSet scopeTables, string tableAlias) { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); string alias = tableAlias; DbTableSegment tableSeg = new DbTableSegment(subQuery, alias, LockType.Unspecified); DbJoinTableExpression joinTable = new DbJoinTableExpression(joinType.AsDbJoinType(), tableSeg); DbTable aliasTable = new DbTable(tableSeg.Alias); IObjectModel newModel = this.QueryModel.ResultModel.ToNewObjectModel(sqlQuery, aliasTable, joinTable); scopeParameters[conditionExpression.Parameters[conditionExpression.Parameters.Count - 1]] = newModel; DbExpression condition = GeneralExpressionParser.Parse(conditionExpression, scopeParameters, scopeTables); joinTable.Condition = condition; JoinQueryResult result = new JoinQueryResult(); result.ResultModel = newModel; result.JoinTable = joinTable; return(result); }
public override DbExpression Visit(DbJoinTableExpression exp) { return(exp); }
public override DbExpression Visit(DbJoinTableExpression exp) { return(exp.Accept(this._generator)); }
public abstract T Visit(DbJoinTableExpression exp);
public virtual JoinQueryResult ToJoinQueryResult(JoinType joinType, LambdaExpression conditionExpression, DbFromTableExpression fromTable, List<IMappingObjectExpression> moeList, string tableAlias) { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); string alias = tableAlias; DbTableSegment tableSeg = new DbTableSegment(subQuery, alias); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); List<IMappingObjectExpression> moes = new List<IMappingObjectExpression>(moeList.Count + 1); moes.AddRange(moeList); moes.Add(newMoe); DbExpression condition = GeneralExpressionVisitor.VisitPredicate(conditionExpression, moes); DbJoinTableExpression joinTable = new DbJoinTableExpression(joinType, tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = newMoe; result.JoinTable = joinTable; return result; }