private bool TryBindProperty(Expression source, MemberIdentity member, out SqlExpression expression)
        {
            if (source is EntityShaperExpression entityShaperExpression)
            {
                var projectionBindingExpression = (ProjectionBindingExpression)entityShaperExpression.ValueBufferExpression;
                var selectExpression            = ((SelectExpression)projectionBindingExpression.QueryExpression);

                var entityType = entityShaperExpression.EntityType;
                var property   = member.MemberInfo != null
                    ? entityType.FindProperty(member.MemberInfo)
                    : entityType.FindProperty(member.Name);

                if (property != null)
                {
                    expression = selectExpression.BindProperty(property, projectionBindingExpression);
                    return(true);
                }

                var navigation = member.MemberInfo != null
                    ? entityType.FindNavigation(member.MemberInfo)
                    : entityType.FindNavigation(member.Name);

                expression = selectExpression.BindNavigation(navigation, projectionBindingExpression);
                return(true);
            }
            else if (source is ObjectAccessExpression objectAccessExpression)
            {
                var entityType = objectAccessExpression.Navigation.GetTargetType();
                var property   = member.MemberInfo != null
                    ? entityType.FindProperty(member.MemberInfo)
                    : entityType.FindProperty(member.Name);

                if (property != null)
                {
                    expression = new KeyAccessExpression(property, objectAccessExpression);
                    return(true);
                }

                var navigation = member.MemberInfo != null
                    ? entityType.FindNavigation(member.MemberInfo)
                    : entityType.FindNavigation(member.Name);

                expression = new ObjectAccessExpression(navigation, objectAccessExpression);
                return(true);
            }

            expression = null;
            return(false);
        }
        public ObjectAccessExpression BindNavigation(INavigation navigation)
        {
            if (!EntityType.GetTypesInHierarchy().Contains(navigation.DeclaringEntityType))
            {
                throw new InvalidOperationException(
                          $"Called EntityProjectionExpression.GetNavigation() with incorrect INavigation. EntityType:{EntityType.DisplayName()}, Navigation:{navigation.Name}");
            }

            if (!_navigationExpressionsCache.TryGetValue(navigation, out var expression))
            {
                expression = new ObjectAccessExpression(navigation, AccessExpression);
                _navigationExpressionsCache[navigation] = expression;
            }

            return(expression);
        }
Ejemplo n.º 3
0
        private bool TryBindProperty(Expression source, MemberIdentity member, out SqlExpression expression)
        {
            if (source is EntityProjectionExpression entityProjectionExpression)
            {
                var entityType = entityProjectionExpression.EntityType;
                var property   = member.MemberInfo != null
                    ? entityType.FindProperty(member.MemberInfo)
                    : entityType.FindProperty(member.Name);

                if (property != null)
                {
                    expression = entityProjectionExpression.BindProperty(property);
                    return(true);
                }

                var navigation = member.MemberInfo != null
                    ? entityType.FindNavigation(member.MemberInfo)
                    : entityType.FindNavigation(member.Name);

                expression = entityProjectionExpression.BindNavigation(navigation);
                return(true);
            }
            else if (source is ObjectAccessExpression objectAccessExpression)
            {
                var entityType = objectAccessExpression.Navigation.GetTargetType();
                var property   = member.MemberInfo != null
                    ? entityType.FindProperty(member.MemberInfo)
                    : entityType.FindProperty(member.Name);

                if (property != null)
                {
                    expression = new KeyAccessExpression(property, objectAccessExpression);
                    return(true);
                }

                var navigation = member.MemberInfo != null
                    ? entityType.FindNavigation(member.MemberInfo)
                    : entityType.FindNavigation(member.Name);

                expression = new ObjectAccessExpression(navigation, objectAccessExpression);
                return(true);
            }

            expression = null;
            return(false);
        }
 protected abstract Expression VisitObjectAccess(ObjectAccessExpression objectAccessExpression);
Ejemplo n.º 5
0
        protected override Expression VisitObjectAccess(ObjectAccessExpression objectAccessExpression)
        {
            _sqlBuilder.Append(objectAccessExpression);

            return(objectAccessExpression);
        }