Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }