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)); }
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)); }
/// <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); }
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)); }
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); }
/// <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); }
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); }