Beispiel #1
0
        /// <inheritdoc />
        public override void VisitSelectClause(
            SelectClause selectClause,
            QueryModel queryModel)
        {
            Check.NotNull(selectClause, nameof(selectClause));
            Check.NotNull(queryModel, nameof(queryModel));

            if (selectClause.Selector.Type == Expression.Type.GetSequenceType() &&
                selectClause.Selector is QuerySourceReferenceExpression)
            {
                return;
            }

            Expression selector = ReplaceClauseReferences(
                _projectionExpressionVisitorFactory
                .Create(this, queryModel.MainFromClause)
                .Visit(selectClause.Selector),
                inProjection: true);

            if ((Expression.Type.TryGetSequenceType() != null || !(selectClause.Selector is QuerySourceReferenceExpression)) &&
                !queryModel.ResultOperators
                .Select(ro => ro.GetType())
                .Any(
                    t => t == typeof(GroupResultOperator) ||
                    t == typeof(AllResultOperator)))
            {
                Expression = Expression.Call(
                    LinqOperatorProvider.Select
                    .MakeGenericMethod(CurrentParameter.Type, selector.Type),
                    Expression,
                    Expression.Lambda(ConvertToRelationshipAssignments(selector), CurrentParameter));
            }
        }
Beispiel #2
0
        public override void VisitSelectClause(
            [NotNull] SelectClause selectClause, [NotNull] QueryModel queryModel)
        {
            Check.NotNull(selectClause, nameof(selectClause));
            Check.NotNull(queryModel, nameof(queryModel));

            var sequenceType = _expression.Type.GetSequenceType();

            if (selectClause.Selector.Type == sequenceType)
            {
                return;
            }

            var selector
                = ReplaceClauseReferences(
                      _projectionExpressionVisitorFactory
                      .Create(this, queryModel.MainFromClause)
                      .Visit(selectClause.Selector),
                      inProjection: true);

            if (selector.Type != sequenceType)
            {
                _expression
                    = Expression.Call(
                          LinqOperatorProvider.Select
                          .MakeGenericMethod(CurrentParameter.Type, selector.Type),
                          _expression,
                          Expression.Lambda(selector, CurrentParameter));
            }
        }