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