private void IncludeReference(IQuerySource querySource, INavigation navigation) { var selectExpression = QueryCompilationContext.FindSelectExpression(querySource); var dependentTableExpression = selectExpression.FindTableForQuerySource(querySource); var targetEntityType = navigation.GetTargetType(); var targetTableName = QueryCompilationContext.GetTableName(targetEntityType); var targetTableExpression = new TableExpression( targetTableName, QueryCompilationContext.GetSchema(targetEntityType), targetTableName.First().ToString().ToLower(), querySource); var readerOffset = selectExpression.Projection.Count; var columnExpressions = targetEntityType.Properties .Select(p => new ColumnExpression(p, targetTableExpression)); var innerJoinExpression = navigation.ForeignKey.IsRequired ? selectExpression .AddInnerJoin(targetTableExpression, columnExpressions) : selectExpression .AddOuterJoin(targetTableExpression, columnExpressions); Expression joinPredicateExpression = null; var primaryKeyProperties = targetEntityType.GetPrimaryKey().Properties; for (var i = 0; i < navigation.ForeignKey.Properties.Count; i++) { var primaryKeyProperty = primaryKeyProperties[i]; var foreignKeyProperty = navigation.ForeignKey.Properties[i]; var equalExpression = Expression.Equal( new ColumnExpression(primaryKeyProperty, innerJoinExpression), new ColumnExpression(foreignKeyProperty, dependentTableExpression)); joinPredicateExpression = joinPredicateExpression == null ? equalExpression : Expression.AndAlso(joinPredicateExpression, equalExpression); } innerJoinExpression.Predicate = joinPredicateExpression; Expression = new IncludeReferenceExpressionTreeVisitor(querySource, navigation, readerOffset) .VisitExpression(Expression); }
private void IncludeReference(IQuerySource querySource, INavigation navigation) { var selectExpression = QueryCompilationContext.FindSelectExpression(querySource); var targetTableExpression = selectExpression.FindTableForQuerySource(querySource); var targetEntityType = navigation.GetTargetType(); var targetTableName = QueryCompilationContext.GetTableName(targetEntityType); var targetTableAlias = CreateUniqueAlias(selectExpression, targetTableName.First().ToString().ToLower()); var joinedTableExpression = new TableExpression( targetTableName, QueryCompilationContext.GetSchema(targetEntityType), targetTableAlias, querySource); var readerOffset = selectExpression.Projection.Count; var columnExpressions = targetEntityType.Properties .Select(p => new ColumnExpression( QueryCompilationContext.GetColumnName(p), p, joinedTableExpression)); var joinExpression = navigation.ForeignKey.IsRequired ? selectExpression .AddInnerJoin(joinedTableExpression, columnExpressions) : selectExpression .AddOuterJoin(joinedTableExpression, columnExpressions); joinExpression.Predicate = BuildJoinEqualityExpression( navigation, (navigation.PointsToPrincipal ? targetEntityType : navigation.EntityType) .GetPrimaryKey().Properties, navigation.PointsToPrincipal ? targetTableExpression : joinExpression, navigation.PointsToPrincipal ? joinExpression : targetTableExpression); Expression = new IncludeReferenceExpressionTreeVisitor(querySource, navigation, readerOffset) .VisitExpression(Expression); }