private static bool IsSubqueryScalarExpression()

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