diff --git a/src/EFCore.Cosmos/Properties/CosmosStrings.Designer.cs b/src/EFCore.Cosmos/Properties/CosmosStrings.Designer.cs index 995c5cf7e94..4b50fddc488 100644 --- a/src/EFCore.Cosmos/Properties/CosmosStrings.Designer.cs +++ b/src/EFCore.Cosmos/Properties/CosmosStrings.Designer.cs @@ -593,6 +593,14 @@ public static string UnableToBindMemberToEntityProjection(object? memberType, ob GetString("UnableToBindMemberToEntityProjection", nameof(memberType), nameof(member), nameof(entityType)), memberType, member, entityType); + /// + /// Unhandled expression '{expression}' of type '{expressionType}' encountered in '{visitor}'. + /// + public static string UnhandledExpressionInVisitor(object? expression, object? expressionType, object? visitor) + => string.Format( + GetString("UnhandledExpressionInVisitor", nameof(expression), nameof(expressionType), nameof(visitor)), + expression, expressionType, visitor); + /// /// Unsupported operator '{nodeType}' specified for expression of type '{expressionType}'. /// diff --git a/src/EFCore.Cosmos/Properties/CosmosStrings.resx b/src/EFCore.Cosmos/Properties/CosmosStrings.resx index b3ec0d9d9b0..4e4ece63670 100644 --- a/src/EFCore.Cosmos/Properties/CosmosStrings.resx +++ b/src/EFCore.Cosmos/Properties/CosmosStrings.resx @@ -394,6 +394,9 @@ Unable to bind '{memberType}' '{member}' to an entity projection of '{entityType}'. + + Unhandled expression '{expression}' of type '{expressionType}' encountered in '{visitor}'. + Unsupported operator '{nodeType}' specified for expression of type '{expressionType}'. diff --git a/src/EFCore.Cosmos/Query/Internal/CosmosQuerySqlGenerator.cs b/src/EFCore.Cosmos/Query/Internal/CosmosQuerySqlGenerator.cs index 4542629ff12..24e4145ab2f 100644 --- a/src/EFCore.Cosmos/Query/Internal/CosmosQuerySqlGenerator.cs +++ b/src/EFCore.Cosmos/Query/Internal/CosmosQuerySqlGenerator.cs @@ -12,7 +12,7 @@ namespace Microsoft.EntityFrameworkCore.Cosmos.Query.Internal; /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// -public class CosmosQuerySqlGenerator(ITypeMappingSource typeMappingSource) : SqlExpressionVisitor +public class CosmosQuerySqlGenerator(ITypeMappingSource typeMappingSource) : ExpressionVisitor { private readonly IndentedStringBuilder _sqlBuilder = new(); private IReadOnlyDictionary _parameterValues = null!; @@ -62,7 +62,49 @@ public virtual CosmosSqlQuery GetSqlQuery( /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitStructuralTypeProjection(StructuralTypeProjectionExpression structuralTypeProjectionExpression) + protected override Expression VisitExtension(Expression expression) + => expression switch + { + ShapedQueryExpression e => e.UpdateQueryExpression(Visit(e.QueryExpression)), + ArrayConstantExpression e => VisitArrayConstant(e), + ExistsExpression e => VisitExists(e), + FragmentExpression e => VisitFragment(e), + FromSqlExpression e => VisitFromSql(e), + InExpression e => VisitIn(e), + ObjectAccessExpression e => VisitObjectAccess(e), + ObjectArrayAccessExpression e => VisitObjectArrayAccess(e), + ObjectArrayExpression e => VisitObjectArray(e), + ObjectArrayIndexExpression e => VisitObjectArrayIndex(e), + ObjectBinaryExpression e => VisitObjectBinary(e), + ObjectFunctionExpression e => VisitObjectFunction(e), + ObjectReferenceExpression e => VisitObjectReference(e), + OrderingExpression e => VisitOrdering(e), + ProjectionExpression e => VisitProjection(e), + ScalarAccessExpression e => VisitScalarAccess(e), + ScalarArrayExpression e => VisitScalarArray(e), + ScalarReferenceExpression e => VisitValueReference(e), + ScalarSubqueryExpression e => VisitScalarSubquery(e), + SelectExpression e => VisitSelect(e), + SourceExpression e => VisitSource(e), + SqlBinaryExpression e => VisitSqlBinary(e), + SqlConditionalExpression e => VisitSqlConditional(e), + SqlConstantExpression e => VisitSqlConstant(e), + SqlFunctionExpression e => VisitSqlFunction(e), + SqlParameterExpression e => VisitSqlParameter(e), + SqlUnaryExpression e => VisitSqlUnary(e), + StructuralTypeProjectionExpression e => VisitStructuralTypeProjection(e), + + _ => throw new InvalidOperationException( + CosmosStrings.UnhandledExpressionInVisitor(expression, expression.GetType(), nameof(CosmosQuerySqlGenerator))), + }; + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected virtual Expression VisitStructuralTypeProjection(StructuralTypeProjectionExpression structuralTypeProjectionExpression) { Visit(structuralTypeProjectionExpression.Object); @@ -75,7 +117,7 @@ protected override Expression VisitStructuralTypeProjection(StructuralTypeProjec /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitExists(ExistsExpression existsExpression) + protected virtual Expression VisitExists(ExistsExpression existsExpression) { _sqlBuilder.AppendLine("EXISTS ("); @@ -95,7 +137,7 @@ protected override Expression VisitExists(ExistsExpression existsExpression) /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitObjectArray(ObjectArrayExpression objectArrayExpression) + protected virtual Expression VisitObjectArray(ObjectArrayExpression objectArrayExpression) { GenerateArray(objectArrayExpression.Subquery); return objectArrayExpression; @@ -107,7 +149,7 @@ protected override Expression VisitObjectArray(ObjectArrayExpression objectArray /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitScalarArray(ScalarArrayExpression scalarArrayExpression) + protected virtual Expression VisitScalarArray(ScalarArrayExpression scalarArrayExpression) { GenerateArray(scalarArrayExpression.Subquery); return scalarArrayExpression; @@ -131,7 +173,7 @@ private void GenerateArray(SelectExpression subquery) /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitObjectArrayAccess(ObjectArrayAccessExpression objectArrayAccessExpression) + protected virtual Expression VisitObjectArrayAccess(ObjectArrayAccessExpression objectArrayAccessExpression) { Visit(objectArrayAccessExpression.Object); @@ -149,7 +191,7 @@ protected override Expression VisitObjectArrayAccess(ObjectArrayAccessExpression /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitObjectArrayIndex(ObjectArrayIndexExpression objectArrayIndexExpression) + protected virtual Expression VisitObjectArrayIndex(ObjectArrayIndexExpression objectArrayIndexExpression) { Visit(objectArrayIndexExpression.Array); _sqlBuilder.Append("["); @@ -165,7 +207,7 @@ protected override Expression VisitObjectArrayIndex(ObjectArrayIndexExpression o /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitScalarAccess(ScalarAccessExpression scalarAccessExpression) + protected virtual Expression VisitScalarAccess(ScalarAccessExpression scalarAccessExpression) { Visit(scalarAccessExpression.Object); @@ -188,7 +230,7 @@ protected override Expression VisitScalarAccess(ScalarAccessExpression scalarAcc /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitObjectAccess(ObjectAccessExpression objectAccessExpression) + protected virtual Expression VisitObjectAccess(ObjectAccessExpression objectAccessExpression) { Visit(objectAccessExpression.Object); @@ -206,7 +248,7 @@ protected override Expression VisitObjectAccess(ObjectAccessExpression objectAcc /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitScalarSubquery(ScalarSubqueryExpression scalarSubqueryExpression) + protected virtual Expression VisitScalarSubquery(ScalarSubqueryExpression scalarSubqueryExpression) { _sqlBuilder.AppendLine("("); using (_sqlBuilder.Indent()) @@ -225,7 +267,7 @@ protected override Expression VisitScalarSubquery(ScalarSubqueryExpression scala /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitProjection(ProjectionExpression projectionExpression) + protected virtual Expression VisitProjection(ProjectionExpression projectionExpression) { GenerateProjection(projectionExpression, objectProjectionStyle: false); return projectionExpression; @@ -269,7 +311,7 @@ private void GenerateProjection(ProjectionExpression projectionExpression, bool /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitObjectReference(ObjectReferenceExpression objectReferenceExpression) + protected virtual Expression VisitObjectReference(ObjectReferenceExpression objectReferenceExpression) { _sqlBuilder.Append(objectReferenceExpression.Name); @@ -282,7 +324,7 @@ protected override Expression VisitObjectReference(ObjectReferenceExpression obj /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitValueReference(ScalarReferenceExpression scalarReferenceExpression) + protected virtual Expression VisitValueReference(ScalarReferenceExpression scalarReferenceExpression) { _sqlBuilder.Append(scalarReferenceExpression.Name); @@ -295,7 +337,7 @@ protected override Expression VisitValueReference(ScalarReferenceExpression scal /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitSelect(SelectExpression selectExpression) + protected virtual Expression VisitSelect(SelectExpression selectExpression) { _sqlBuilder.Append("SELECT "); @@ -402,8 +444,13 @@ protected override Expression VisitSelect(SelectExpression selectExpression) return selectExpression; } - /// - protected override Expression VisitFromSql(FromSqlExpression fromSqlExpression) + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected virtual Expression VisitFromSql(FromSqlExpression fromSqlExpression) { var sql = fromSqlExpression.Sql; @@ -475,7 +522,7 @@ fromSqlExpression.Arguments is ConstantExpression constantExpression /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitOrdering(OrderingExpression orderingExpression) + protected virtual Expression VisitOrdering(OrderingExpression orderingExpression) { Visit(orderingExpression.Expression); @@ -493,7 +540,7 @@ protected override Expression VisitOrdering(OrderingExpression orderingExpressio /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpression) + protected virtual Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpression) { if (sqlBinaryExpression.OperatorType is ExpressionType.ArrayIndex) { @@ -567,7 +614,7 @@ protected override Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpres /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitObjectBinary(ObjectBinaryExpression objectBinaryExpression) + protected virtual Expression VisitObjectBinary(ObjectBinaryExpression objectBinaryExpression) { var op = objectBinaryExpression.OperatorType switch { @@ -591,7 +638,7 @@ protected override Expression VisitObjectBinary(ObjectBinaryExpression objectBin /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitSqlUnary(SqlUnaryExpression sqlUnaryExpression) + protected virtual Expression VisitSqlUnary(SqlUnaryExpression sqlUnaryExpression) { var op = sqlUnaryExpression.OperatorType switch { @@ -648,7 +695,7 @@ private void GenerateList( /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitSqlConstant(SqlConstantExpression sqlConstantExpression) + protected virtual Expression VisitSqlConstant(SqlConstantExpression sqlConstantExpression) { Check.DebugAssert(sqlConstantExpression.TypeMapping is not null, "SqlConstantExpression without a type mapping"); _sqlBuilder.Append(((CosmosTypeMapping)sqlConstantExpression.TypeMapping).GenerateConstant(sqlConstantExpression.Value)); @@ -662,7 +709,7 @@ protected override Expression VisitSqlConstant(SqlConstantExpression sqlConstant /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitFragment(FragmentExpression fragmentExpression) + protected virtual Expression VisitFragment(FragmentExpression fragmentExpression) { _sqlBuilder.Append(fragmentExpression.Fragment); @@ -675,7 +722,7 @@ protected override Expression VisitFragment(FragmentExpression fragmentExpressio /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitSqlConditional(SqlConditionalExpression sqlConditionalExpression) + protected virtual Expression VisitSqlConditional(SqlConditionalExpression sqlConditionalExpression) { _sqlBuilder.Append('('); Visit(sqlConditionalExpression.Test); @@ -694,7 +741,7 @@ protected override Expression VisitSqlConditional(SqlConditionalExpression sqlCo /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitSqlParameter(SqlParameterExpression sqlParameterExpression) + protected virtual Expression VisitSqlParameter(SqlParameterExpression sqlParameterExpression) { if (!_sqlParametersByOriginalName.TryGetValue(sqlParameterExpression.Name, out var sqlParameter)) { @@ -722,7 +769,7 @@ protected override Expression VisitSqlParameter(SqlParameterExpression sqlParame /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected sealed override Expression VisitIn(InExpression inExpression) + protected virtual Expression VisitIn(InExpression inExpression) { GenerateIn(inExpression, negated: false); @@ -735,7 +782,7 @@ protected sealed override Expression VisitIn(InExpression inExpression) /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitArrayConstant(ArrayConstantExpression arrayConstantExpression) + protected virtual Expression VisitArrayConstant(ArrayConstantExpression arrayConstantExpression) { _sqlBuilder.Append("["); @@ -761,7 +808,7 @@ protected override Expression VisitArrayConstant(ArrayConstantExpression arrayCo /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected sealed override Expression VisitSource(SourceExpression sourceExpression) + protected virtual Expression VisitSource(SourceExpression sourceExpression) { // https://learn.microsoft.com/azure/cosmos-db/nosql/query/from if (sourceExpression.WithIn) @@ -858,7 +905,7 @@ protected virtual void GenerateIn(InExpression inExpression, bool negated) /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitObjectFunction(ObjectFunctionExpression objectFunctionExpression) + protected virtual Expression VisitObjectFunction(ObjectFunctionExpression objectFunctionExpression) { GenerateFunction(objectFunctionExpression.Name, objectFunctionExpression.Arguments); return objectFunctionExpression; @@ -870,7 +917,7 @@ protected override Expression VisitObjectFunction(ObjectFunctionExpression objec /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - protected override Expression VisitSqlFunction(SqlFunctionExpression sqlFunctionExpression) + protected virtual Expression VisitSqlFunction(SqlFunctionExpression sqlFunctionExpression) { GenerateFunction(sqlFunctionExpression.Name, sqlFunctionExpression.Arguments); return sqlFunctionExpression; diff --git a/src/EFCore.Cosmos/Query/Internal/SqlExpressionVisitor.cs b/src/EFCore.Cosmos/Query/Internal/SqlExpressionVisitor.cs deleted file mode 100644 index f9728a62aaa..00000000000 --- a/src/EFCore.Cosmos/Query/Internal/SqlExpressionVisitor.cs +++ /dev/null @@ -1,271 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.EntityFrameworkCore.Cosmos.Query.Internal; - -/// -/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to -/// the same compatibility standards as public APIs. It may be changed or removed without notice in -/// any release. You should only use it directly in your code with extreme caution and knowing that -/// doing so can result in application failures when updating to a new Entity Framework Core release. -/// -public abstract class SqlExpressionVisitor : ExpressionVisitor -{ - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected override Expression VisitExtension(Expression extensionExpression) - => extensionExpression switch - { - ShapedQueryExpression shapedQueryExpression - => shapedQueryExpression.UpdateQueryExpression(Visit(shapedQueryExpression.QueryExpression)), - SelectExpression selectExpression => VisitSelect(selectExpression), - ProjectionExpression projectionExpression => VisitProjection(projectionExpression), - StructuralTypeProjectionExpression structuralTypeProjectionExpression => VisitStructuralTypeProjection(structuralTypeProjectionExpression), - ObjectArrayAccessExpression arrayProjectionExpression => VisitObjectArrayAccess(arrayProjectionExpression), - FromSqlExpression fromSqlExpression => VisitFromSql(fromSqlExpression), - ObjectReferenceExpression objectReferenceExpression => VisitObjectReference(objectReferenceExpression), - ScalarAccessExpression keyAccessExpression => VisitScalarAccess(keyAccessExpression), - ObjectAccessExpression objectAccessExpression => VisitObjectAccess(objectAccessExpression), - ScalarSubqueryExpression scalarSubqueryExpression => VisitScalarSubquery(scalarSubqueryExpression), - SqlBinaryExpression sqlBinaryExpression => VisitSqlBinary(sqlBinaryExpression), - ObjectBinaryExpression objectBinaryExpression => VisitObjectBinary(objectBinaryExpression), - SqlConstantExpression sqlConstantExpression => VisitSqlConstant(sqlConstantExpression), - FragmentExpression jsonFragmentExpression => VisitFragment(jsonFragmentExpression), - SqlUnaryExpression sqlUnaryExpression => VisitSqlUnary(sqlUnaryExpression), - SqlConditionalExpression sqlConditionalExpression => VisitSqlConditional(sqlConditionalExpression), - SqlParameterExpression sqlParameterExpression => VisitSqlParameter(sqlParameterExpression), - InExpression inExpression => VisitIn(inExpression), - ArrayConstantExpression inlineArrayExpression => VisitArrayConstant(inlineArrayExpression), - SourceExpression sourceExpression => VisitSource(sourceExpression), - ObjectFunctionExpression objectFunctionExpression => VisitObjectFunction(objectFunctionExpression), - SqlFunctionExpression sqlFunctionExpression => VisitSqlFunction(sqlFunctionExpression), - OrderingExpression orderingExpression => VisitOrdering(orderingExpression), - ScalarReferenceExpression valueReferenceExpression => VisitValueReference(valueReferenceExpression), - ExistsExpression existsExpression => VisitExists(existsExpression), - ObjectArrayExpression arrayExpression => VisitObjectArray(arrayExpression), - ScalarArrayExpression arrayExpression => VisitScalarArray(arrayExpression), - ObjectArrayIndexExpression objectArrayIndexExpression => VisitObjectArrayIndex(objectArrayIndexExpression), - - _ => base.VisitExtension(extensionExpression) - }; - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitExists(ExistsExpression existsExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitObjectArray(ObjectArrayExpression objectArrayExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitScalarArray(ScalarArrayExpression scalarArrayExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitObjectArrayIndex(ObjectArrayIndexExpression objectArrayIndexExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitFromSql(FromSqlExpression fromSqlExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitOrdering(OrderingExpression orderingExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitObjectFunction(ObjectFunctionExpression objectFunctionExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSqlFunction(SqlFunctionExpression sqlFunctionExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitIn(InExpression inExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitArrayConstant(ArrayConstantExpression arrayConstantExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSource(SourceExpression sourceExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSqlParameter(SqlParameterExpression sqlParameterExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSqlConditional(SqlConditionalExpression sqlConditionalExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSqlUnary(SqlUnaryExpression sqlUnaryExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSqlConstant(SqlConstantExpression sqlConstantExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitFragment(FragmentExpression fragmentExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitObjectBinary(ObjectBinaryExpression objectBinaryExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitScalarAccess(ScalarAccessExpression scalarAccessExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitObjectAccess(ObjectAccessExpression objectAccessExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitScalarSubquery(ScalarSubqueryExpression scalarSubqueryExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitObjectReference(ObjectReferenceExpression objectReferenceExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitStructuralTypeProjection(StructuralTypeProjectionExpression structuralTypeProjectionExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitObjectArrayAccess(ObjectArrayAccessExpression objectArrayAccessExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitProjection(ProjectionExpression projectionExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitSelect(SelectExpression selectExpression); - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - protected abstract Expression VisitValueReference(ScalarReferenceExpression scalarReferenceExpression); -}