protected override Expression VisitExtension(Expression extensionExpression)
        {
            if (extensionExpression is EntityShaperExpression entityShaperExpression)
            {
                var projectionBindingExpression = (ProjectionBindingExpression)entityShaperExpression.ValueBufferExpression;
                VerifyQueryExpression(projectionBindingExpression);

                if (_clientEval)
                {
                    var entityProjection = (EntityProjectionExpression)_queryExpression.GetMappedProjection(
                        projectionBindingExpression.ProjectionMember);

                    return(entityShaperExpression.Update(
                               new ProjectionBindingExpression(_queryExpression, _queryExpression.AddToProjection(entityProjection))));
                }
                else
                {
                    _projectionMapping[_projectionMembers.Peek()]
                        = _queryExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember);

                    return(entityShaperExpression.Update(
                               new ProjectionBindingExpression(_queryExpression, _projectionMembers.Peek(), typeof(ValueBuffer))));
                }
            }

            throw new InvalidOperationException();
        }
 private object GetProjectionIndex(ProjectionBindingExpression projectionBindingExpression)
 {
     return(projectionBindingExpression.ProjectionMember != null
         ? ((ConstantExpression)_queryExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember)).Value
         : (projectionBindingExpression.Index != null
             ? (object)projectionBindingExpression.Index
             : projectionBindingExpression.IndexMap));
 }
Esempio n. 3
0
            protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression)
            {
                if (methodCallExpression.Method.IsGenericMethod &&
                    methodCallExpression.Method.GetGenericMethodDefinition() == EntityMaterializerSource.TryReadValueMethod)
                {
                    var originalIndex = (int)((ConstantExpression)methodCallExpression.Arguments[1]).Value;
                    var indexOffset   = methodCallExpression.Arguments[0] is ProjectionBindingExpression projectionBindingExpression
                        ? ((EntityProjectionExpression)_queryExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember)).StartIndex
                        : _materializationContextBindings[(ParameterExpression)((MethodCallExpression)methodCallExpression.Arguments[0]).Object];

                    return(Expression.Call(
                               methodCallExpression.Method,
                               InMemoryQueryExpression.ValueBufferParameter,
                               Expression.Constant(indexOffset + originalIndex),
                               methodCallExpression.Arguments[2]));
                }

                return(base.VisitMethodCall(methodCallExpression));
            }
        public override Expression Visit(Expression expression)
        {
            if (expression == null)
            {
                return(null);
            }

            if (!(expression is NewExpression ||
                  expression is MemberInitExpression ||
                  expression is EntityShaperExpression))
            {
                // TODO: Remove when InMemory implements client eval projection
                // This converts object[] from GetDatabaseValues to appropriate projection.
                if (expression is NewArrayExpression newArrayExpression &&
                    newArrayExpression.NodeType == ExpressionType.NewArrayInit &&
                    newArrayExpression.Expressions.Count > 0 &&
                    newArrayExpression.Expressions[0] is UnaryExpression unaryExpression &&
                    unaryExpression.NodeType == ExpressionType.Convert &&
                    unaryExpression.Type == typeof(object) &&
                    unaryExpression.Operand is MethodCallExpression methodCall &&
                    methodCall.TryGetEFPropertyArguments(out var source, out _) &&
                    source is EntityShaperExpression entityShaperExpression &&
                    entityShaperExpression.EntityType.GetProperties().Count() == newArrayExpression.Expressions.Count)
                {
                    VerifyQueryExpression(entityShaperExpression.ValueBufferExpression);

                    _projectionMapping[_projectionMembers.Peek()]
                        = _queryExpression.GetMappedProjection(
                              entityShaperExpression.ValueBufferExpression.ProjectionMember);

                    return(new EntityValuesExpression(entityShaperExpression.EntityType, entityShaperExpression.ValueBufferExpression));
                }

                var translation = _expressionTranslatingExpressionVisitor.Translate(_queryExpression, expression);

                _projectionMapping[_projectionMembers.Peek()] = translation;

                return(new ProjectionBindingExpression(_queryExpression, _projectionMembers.Peek(), expression.Type));
            }

            return(base.Visit(expression));
        }
Esempio n. 5
0
        protected override Expression VisitExtension(Expression extensionExpression)
        {
            if (extensionExpression is EntityShaperExpression)
            {
                return(extensionExpression);
            }

            if (extensionExpression is ProjectionBindingExpression projectionBindingExpression)
            {
                return(_inMemoryQueryExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember));
            }

            if (extensionExpression is NullConditionalExpression nullConditionalExpression)
            {
                var translation = Visit(nullConditionalExpression.AccessOperation);

                return(translation.Type == nullConditionalExpression.Type
                    ? translation
                    : Expression.Convert(translation, nullConditionalExpression.Type));
            }

            return(base.VisitExtension(extensionExpression));
        }