public override Expression GetMemberExpression(Expression root, MappingEntity entity, MemberInfo member) { if (this.mapping.IsAssociationRelationship(entity, member)) { MappingEntity relatedEntity = this.mapping.GetRelatedEntity(entity, member); ProjectionExpression queryExpression = this.GetQueryExpression(relatedEntity); List <MemberInfo> list = this.mapping.GetAssociationKeyMembers(entity, member).ToList <MemberInfo>(); List <MemberInfo> list2 = this.mapping.GetAssociationRelatedKeyMembers(entity, member).ToList <MemberInfo>(); Expression expression2 = null; int num = 0; int count = list2.Count; while (num < count) { Expression expression3 = this.GetMemberExpression(queryExpression.Projector, relatedEntity, list2[num]).Equal(this.GetMemberExpression(root, entity, list[num])); expression2 = (expression2 != null) ? expression2.And(expression3) : expression3; num++; } TableAlias newAlias = new TableAlias(); ProjectedColumns columns = ColumnProjector.ProjectColumns(this.translator.Linguist.Language, queryExpression.Projector, null, newAlias, new TableAlias[] { queryExpression.Select.Alias }); LambdaExpression aggregator = Aggregator.GetAggregator(King.Framework.Linq.TypeHelper.GetMemberType(member), typeof(IEnumerable <>).MakeGenericType(new Type[] { columns.Projector.Type })); ProjectionExpression expression = new ProjectionExpression(new SelectExpression(newAlias, columns.Columns, queryExpression.Select, expression2), columns.Projector, aggregator); return(this.translator.Police.ApplyPolicy(expression, member)); } AliasedExpression expression6 = root as AliasedExpression; if ((expression6 != null) && this.mapping.IsColumn(entity, member)) { return(new ColumnExpression(King.Framework.Linq.TypeHelper.GetMemberType(member), this.GetColumnType(entity, member), expression6.Alias, this.mapping.GetColumnName(entity, member))); } return(QueryBinder.BindMember(root, member)); }
protected virtual void AddAliases(Expression expr) { AliasedExpression expression = expr as AliasedExpression; if (expression != null) { this.AddAlias(expression.Alias); } else { JoinExpression expression2 = expr as JoinExpression; if (expression2 != null) { this.AddAliases(expression2.Left); this.AddAliases(expression2.Right); } } }
protected override Expression VisitJoin(JoinExpression join) { Expression expression = base.VisitJoin(join); join = expression as JoinExpression; if (join != null) { AliasedExpression right = join.Right as AliasedExpression; if (right != null) { AliasedExpression expression3 = (AliasedExpression)this.FindSimilarRight(join.Left as JoinExpression, join); if (expression3 != null) { this.map.Add(right.Alias, expression3.Alias); return(join.Left); } } } return(expression); }
protected override Expression VisitJoin(JoinExpression join) { Expression expression; Expression expression4; if (join.Join == JoinType.SingletonLeftOuter) { AliasedExpression expression2 = this.Visit(join.Right) as AliasedExpression; if (!((expression2 == null) || this.allColumnsUsed.ContainsKey(expression2.Alias))) { return(this.Visit(join.Left)); } Expression expression3 = this.Visit(join.Condition); expression4 = this.Visit(join.Left); expression = this.Visit(join.Right); return(base.UpdateJoin(join, join.Join, expression4, expression, expression3)); } Expression condition = this.Visit(join.Condition); expression = this.VisitSource(join.Right); expression4 = this.VisitSource(join.Left); return(base.UpdateJoin(join, join.Join, expression4, expression, condition)); }