in Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs [1423:1507]
private static bool IsSubqueryScalarExpression(Expression expression, out SubqueryKind? expressionObjKind, out bool isMinMaxAvgMethod)
{
if (!(expression is MethodCallExpression methodCallExpression))
{
expressionObjKind = null;
isMinMaxAvgMethod = false;
return false;
}
string methodName = methodCallExpression.Method.Name;
bool isSubqueryExpression;
isMinMaxAvgMethod = false;
switch (methodName)
{
case LinqMethods.Min:
case LinqMethods.Max:
case LinqMethods.Average:
isMinMaxAvgMethod = true;
isSubqueryExpression = true;
expressionObjKind = SubqueryKind.SubqueryScalarExpression;
break;
case LinqMethods.Sum:
isSubqueryExpression = true;
expressionObjKind = SubqueryKind.SubqueryScalarExpression;
break;
case LinqMethods.Count:
if (methodCallExpression.Arguments.Count > 1)
{
isSubqueryExpression = true;
expressionObjKind = SubqueryKind.SubqueryScalarExpression;
}
else
{
SubqueryKind? objKind;
bool isMinMaxAvg;
isSubqueryExpression = ExpressionToSql.IsSubqueryScalarExpression(
methodCallExpression.Arguments[0] as MethodCallExpression,
out objKind, out isMinMaxAvg);
if (isSubqueryExpression)
{
isSubqueryExpression = true;
expressionObjKind = SubqueryKind.SubqueryScalarExpression;
}
else
{
isSubqueryExpression = false;
expressionObjKind = null;
}
}
break;
case LinqMethods.Any:
isSubqueryExpression = true;
expressionObjKind = SubqueryKind.ExistsScalarExpression;
break;
case LinqMethods.Select:
case LinqMethods.SelectMany:
case LinqMethods.Where:
case LinqMethods.OrderBy:
case LinqMethods.OrderByDescending:
case nameof(CosmosLinqExtensions.OrderByRank):
case LinqMethods.ThenBy:
case LinqMethods.ThenByDescending:
case LinqMethods.Skip:
case LinqMethods.Take:
case LinqMethods.Distinct:
case LinqMethods.GroupBy:
isSubqueryExpression = true;
expressionObjKind = SubqueryKind.ArrayScalarExpression;
break;
default:
isSubqueryExpression = false;
expressionObjKind = null;
break;
}
return isSubqueryExpression;
}