protected override Expression VisitConstant(ConstantExpression constantExpression)
            {
                if (constantExpression.IsEntityQueryable())
                {
                    var entityQueryable = (IQueryable)constantExpression.Value;
                    var entityType      = _model.FindEntityType(entityQueryable.ElementType);

                    if (entityType != null &&
                        !entityType.IsQueryType &&
                        (_referencedEntityTypes > 0 ||
                         entityType.ShadowPropertyCount() > 0))
                    {
                        _requiresBuffering = true;

                        return(constantExpression);
                    }

                    if (entityType != null ||
                        _model.HasEntityTypeWithDefiningNavigation(entityQueryable.ElementType))
                    {
                        _referencedEntityTypes++;
                    }
                }

                return(base.VisitConstant(constantExpression));
            }
        protected override Expression VisitConstant(ConstantExpression constantExpression)
        {
            if (PrintConnections)
            {
                _stringBuilder.SuspendCurrentNode();
            }

            if (constantExpression.Value is IPrintable printable)
            {
                printable.Print(this);
            }
            else if (constantExpression.IsEntityQueryable())
            {
                _stringBuilder.Append($"DbSet<{constantExpression.Type.GetTypeInfo().GenericTypeArguments.First().ShortDisplayName()}>");
            }
            else
            {
                Print(constantExpression.Value);
            }

            if (PrintConnections)
            {
                _stringBuilder.ReconnectCurrentNode();
            }

            return(constantExpression);
        }
            private static bool CompareConstant(ConstantExpression a, ConstantExpression b)
            {
                if (a.Value == b.Value)
                {
                    return(true);
                }

                if (a.Value == null ||
                    b.Value == null)
                {
                    return(false);
                }

                if (a.Value is EnumerableQuery &&
                    b.Value is EnumerableQuery)
                {
                    return(false); // EnumerableQueries are opaque
                }

                if (a.IsEntityQueryable() &&
                    b.IsEntityQueryable() &&
                    a.Value.GetType() == b.Value.GetType())
                {
                    return(true);
                }

                return(Equals(a.Value, b.Value));
            }
示例#4
0
        protected override Expression VisitConstant(ConstantExpression constantExpression)
        {
            Check.NotNull(constantExpression, nameof(constantExpression));

            return(constantExpression.IsEntityQueryable()
                ? CreateShapedQueryExpression(((IQueryable)constantExpression.Value).ElementType)
                : base.VisitConstant(constantExpression));
        }
    protected override Expression VisitConstant(ConstantExpression constantExpression)
    {
        var expression = base.VisitConstant(constantExpression);

        if (instanceFilters == null)
        {
            return(expression);
        }

        if (!constantExpression.IsEntityQueryable())
        {
            return(expression);
        }

        var type       = ((IQueryable)constantExpression.Value).ElementType;
        var entityType = compilationContext.Model.FindEntityType(type)?.RootType();

        if (entityType == null)
        {
            return(expression);
        }

        var lambda = BuildLambda(type);
        var parameterizedFilter
            = (LambdaExpression)generator
              .ExtractParameters(
                  compilationContext.Logger,
                  lambda,
                  parameters,
                  parameterize: false,
                  generateContextAccessors: true);

        var oldParameterExpression = parameterizedFilter.Parameters[0];
        var newParameterExpression = Expression.Parameter(type, oldParameterExpression.Name);

        var predicateExpression
            = ReplacingExpressionVisitor
              .Replace(
                  oldParameterExpression,
                  newParameterExpression,
                  parameterizedFilter.Body);

        var whereExpression
            = Expression.Call(
                  whereMethod.MakeGenericMethod(type),
                  expression,
                  Expression.Lambda(
                      predicateExpression,
                      newParameterExpression));

        var subQueryModel = generator.ParseQuery(whereExpression);

        return(new SubQueryExpression(subQueryModel));
    }
            public override bool TryPrintConstant(
                ConstantExpression constantExpression,
                IndentedStringBuilder stringBuilder,
                bool removeFormatting)
            {
                if (constantExpression.IsEntityQueryable())
                {
                    stringBuilder.Append($"DbSet<{constantExpression.Type.GetTypeInfo().GenericTypeArguments.First().ShortDisplayName()}>");
                    return(true);
                }

                return(false);
            }
        protected override Expression VisitConstant(ConstantExpression constantExpression)
        {
            if (_store != null && constantExpression.IsEntityQueryable())
            {
                var type       = ((IQueryable)constantExpression.Value).ElementType;
                var entityType = _queryCompilationContext.Model.FindEntityType(type)?.RootType();

                if (entityType != null && _store.Dictionary.TryGetValue(type, out var lambda))
                {
                    Expression newExpression = constantExpression;

                    var parameterizedFilter
                        = (LambdaExpression)_queryModelGenerator
                          .ExtractParameters(
                              _queryCompilationContext.Logger,
                              lambda,
                              new Parameters(this.ContextParameters),
                              parameterize: false,
                              generateContextAccessors: true);

                    var oldParameterExpression = parameterizedFilter.Parameters[0];
                    var newParameterExpression = Expression.Parameter(type, oldParameterExpression.Name);

                    var predicateExpression
                        = ReplacingExpressionVisitor
                          .Replace(
                              oldParameterExpression,
                              newParameterExpression,
                              parameterizedFilter.Body);

                    var whereExpression
                        = Expression.Call(
                              _whereMethod.MakeGenericMethod(type),
                              newExpression,
                              Expression.Lambda(
                                  predicateExpression,
                                  newParameterExpression));

                    var subQueryModel = _queryModelGenerator.ParseQuery(whereExpression);

                    newExpression = new SubQueryExpression(subQueryModel);

                    return(newExpression);
                }
            }

            return(base.VisitConstant(constantExpression));
        }
示例#8
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override Expression VisitConstant(ConstantExpression constantExpression)
        {
            if (constantExpression.IsEntityQueryable())
            {
                var type       = ((IQueryable)constantExpression.Value).ElementType;
                var entityType = _queryCompilationContext.Model.FindEntityType(type)?.RootType();

                if (entityType?.QueryFilter != null)
                {
                    var parameterizedFilter
                        = (LambdaExpression)_queryModelGenerator
                          .ExtractParameters(
                              _queryCompilationContext.Logger,
                              entityType.QueryFilter,
                              _parameters,
                              parameterize: false,
                              generateContextAccessors: true);

                    var oldParameterExpression = parameterizedFilter.Parameters[0];
                    var newParameterExpression = Expression.Parameter(type, oldParameterExpression.Name);

                    var predicateExpression
                        = ReplacingExpressionVisitor
                          .Replace(
                              oldParameterExpression,
                              newParameterExpression,
                              parameterizedFilter.Body);

                    var whereExpression
                        = Expression.Call(
                              _whereMethod.MakeGenericMethod(type),
                              constantExpression,
                              Expression.Lambda(
                                  predicateExpression,
                                  newParameterExpression));

                    var subQueryModel = _queryModelGenerator.ParseQuery(whereExpression);

                    return(new SubQueryExpression(subQueryModel));
                }
            }

            return(constantExpression);
        }
示例#9
0
            private static bool CompareConstant(ConstantExpression a, ConstantExpression b)
            {
                if (a.Value == b.Value)
                {
                    return(true);
                }

                if (a.Value == null ||
                    b.Value == null)
                {
                    return(false);
                }

                return(a.IsEntityQueryable() &&
                       b.IsEntityQueryable() &&
                       a.Value.GetType() == b.Value.GetType()
                    ? true
                    : Equals(a.Value, b.Value));
            }
示例#10
0
        protected override Expression VisitConstant(ConstantExpression constantExpression)
        {
            Check.NotNull(constantExpression, nameof(constantExpression));

            if (constantExpression.Value is IPrintableExpression printable)
            {
                printable.Print(this);
            }
            else if (constantExpression.IsEntityQueryable())
            {
                _stringBuilder.Append($"DbSet<{constantExpression.Type.GenericTypeArguments.First().ShortDisplayName()}>");
            }
            else
            {
                Print(constantExpression.Value);
            }

            return(constantExpression);
        }
示例#11
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override Expression VisitConstant(ConstantExpression constantExpression)
        {
            if (constantExpression.IsEntityQueryable())
            {
                var type       = ((IQueryable)constantExpression.Value).ElementType;
                var entityType = _queryCompilationContext.Model.FindEntityType(type)?.RootType();

                if (entityType != null)
                {
                    Expression newExpression = constantExpression;

                    if (entityType.FindPrimaryKey() == null)
                    {
                        IsKeylessQuery = true;

                        var query = entityType.GetDefiningQuery();

                        if (query != null &&
                            _entityQueryModelVisitor.ShouldApplyDefiningQuery(entityType, _querySource))
                        {
                            var parameterizedQuery
                                = _parameterExtractingExpressionVisitor.ExtractParameters(query.Body);

                            var subQueryModel = _queryModelGenerator.ParseQuery(parameterizedQuery);

                            newExpression = new SubQueryExpression(subQueryModel);
                        }
                    }

                    if (!_queryCompilationContext.IgnoreQueryFilters &&
                        entityType.GetQueryFilter() != null)
                    {
                        var parameterizedFilter
                            = (LambdaExpression)_parameterExtractingExpressionVisitor
                              .ExtractParameters(entityType.GetQueryFilter());

                        var oldParameterExpression = parameterizedFilter.Parameters[0];
                        var newParameterExpression = Expression.Parameter(type, oldParameterExpression.Name);

                        var predicateExpression
                            = ReplacingExpressionVisitor
                              .Replace(
                                  oldParameterExpression,
                                  newParameterExpression,
                                  parameterizedFilter.Body);

                        var whereExpression
                            = Expression.Call(
                                  _whereMethod.MakeGenericMethod(type),
                                  newExpression,
                                  Expression.Lambda(
                                      predicateExpression,
                                      newParameterExpression));

                        var subQueryModel = _queryModelGenerator.ParseQuery(whereExpression);

                        newExpression = new SubQueryExpression(subQueryModel);
                    }

                    return(newExpression);
                }
            }

            return(constantExpression);
        }
示例#12
0
 protected override Expression VisitConstant(ConstantExpression constantExpression)
 => constantExpression.IsEntityQueryable()
         ? CreateShapedQueryExpression(((IQueryable)constantExpression.Value).ElementType)
         : base.VisitConstant(constantExpression);
 protected override Expression VisitConstant(ConstantExpression constantExpression)
 => constantExpression.IsEntityQueryable()
         ? new EntityReferenceExpression(constantExpression, Model.FindEntityType(((IQueryable)constantExpression.Value).ElementType))
         : (Expression)constantExpression;
 /// <summary>
 ///     Visits <see cref="ConstantExpression" /> nodes.
 /// </summary>
 /// <param name="constantExpression"> The node being visited. </param>
 /// <returns> An expression to use in place of the node. </returns>
 protected override Expression VisitConstant(ConstantExpression constantExpression)
 => constantExpression.IsEntityQueryable()
         ? VisitEntityQueryable(((IQueryable)constantExpression.Value).ElementType)
         : constantExpression;
 private static bool CompareConstant(ConstantExpression a, ConstantExpression b)
 => a.Value == b.Value ||
 (a.Value != null &&
  b.Value != null &&
  (a.IsEntityQueryable() && b.IsEntityQueryable() && a.Value.GetType() == b.Value.GetType() ||
   Equals(a.Value, b.Value)));
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override Expression VisitConstant(ConstantExpression constantExpression)
        {
            if (constantExpression.IsEntityQueryable())
            {
                var parameterizableQueryable = (IParameterizableQueryable)constantExpression.Value;
                var type       = ((IQueryable)constantExpression.Value).ElementType;
                var entityType = _queryCompilationContext.Model.FindEntityType(type)?.RootType();

                if (entityType != null)
                {
                    Expression newExpression = constantExpression;

                    if (entityType.IsQueryType)
                    {
                        IsViewTypeQuery = true;

                        var query = entityType.DefiningQuery;

                        if (query != null &&
                            _entityQueryModelVisitor.ShouldApplyDefiningQuery(entityType, _querySource) &&
                            parameterizableQueryable.DefiningParameterizedQuery == null)
                        {
                            var parameterizedDefiningQuery
                                = _queryModelGenerator
                                  .ExtractParameters(
                                      _queryCompilationContext.Logger,
                                      query.Body,
                                      _parameters,
                                      parameterize: false,
                                      generateContextAccessors: true);

                            var subQueryModel = _queryModelGenerator.ParseQuery(parameterizedDefiningQuery);

                            newExpression = new SubQueryExpression(subQueryModel);
                        }
                    }

                    if (parameterizableQueryable.DefiningParameterizedQuery != null &&
                        parameterizableQueryable.DefiningParameter != null)
                    {
                        var parameterizedQuery = parameterizableQueryable.DefiningParameterizedQuery.Query;

                        var parsedParameterizedQuery
                            = _queryModelGenerator
                              .ExtractParameters(
                                  _queryCompilationContext.Logger,
                                  parameterizedQuery.Body,
                                  _parameters,
                                  parameterize: false,
                                  generateContextAccessors: true);

                        var scopedParameterizedQuery = new ParameterScopeExpression(parsedParameterizedQuery);

                        var subQueryModel = _queryModelGenerator.ParseQuery(scopedParameterizedQuery);

                        newExpression = new SubQueryExpression(subQueryModel);
                    }

                    if (!_queryCompilationContext.IgnoreQueryFilters &&
                        entityType.QueryFilter != null)
                    {
                        var parameterizedFilter
                            = (LambdaExpression)_queryModelGenerator
                              .ExtractParameters(
                                  _queryCompilationContext.Logger,
                                  entityType.QueryFilter,
                                  _parameters,
                                  parameterize: false,
                                  generateContextAccessors: true);

                        var oldParameterExpression = parameterizedFilter.Parameters[0];
                        var newParameterExpression = Expression.Parameter(type, oldParameterExpression.Name);

                        var predicateExpression
                            = ReplacingExpressionVisitor
                              .Replace(
                                  oldParameterExpression,
                                  newParameterExpression,
                                  parameterizedFilter.Body);

                        var whereExpression
                            = Expression.Call(
                                  _whereMethod.MakeGenericMethod(type),
                                  newExpression,
                                  Expression.Lambda(
                                      predicateExpression,
                                      newParameterExpression));

                        var subQueryModel = _queryModelGenerator.ParseQuery(whereExpression);

                        newExpression = new SubQueryExpression(subQueryModel);
                    }

                    return(newExpression);
                }
            }

            return(constantExpression);
        }