/// Visits a LINQ expression using a new expression visitor and returns a part of the PostgreSQL query it represents.
        private string GetNestedPsqlExpression(Expression linqExpression)
        {
            var visitor = new PsqlGeneratingExpressionVisitor(_queryModelVisitor);

            visitor.Visit(linqExpression);
            return(visitor.GetPsqlExpression());
        }
        public static string GetPsqlExpression(Expression linqExpression, PsqlGeneratingQueryModelVisitor queryModelVisitor, ExpressionVisitorOptions options)
        {
            var visitor = new PsqlGeneratingExpressionVisitor(queryModelVisitor, options);

            visitor.Visit(linqExpression);
            return(visitor.GetPsqlExpression());
        }
        public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index)
        {
            var wherePredicateType = whereClause.Predicate.GetType();

            if (whereClause.Predicate is SubQueryExpression subQuery)
            {
                var t = subQuery.QueryModel.BodyClauses;
                if (subQuery.QueryModel.SelectClause.Selector is QuerySourceReferenceExpression _sExpression)
                {
                    var z  = _sExpression.ReferencedQuerySource.ToString();
                    var z1 = z.Split(' ').LastOrDefault();
                    var z2 = z1?.Split(".".ToCharArray(), 2)[1];

                    _queryParts.AddWherePart(z2);
                    foreach (var queryModelBodyClause in subQuery.QueryModel.BodyClauses)
                    {
                        if (queryModelBodyClause is WhereClause where)
                        {
                            var opts = new ExpressionVisitorOptions();
                            opts.TableName = z2;
                            var expr = PsqlGeneratingExpressionVisitor.GetPsqlExpression(where.Predicate, this, opts); GetPsqlExpression(where.Predicate);
                            _queryParts.AddWherePart(expr);
                        }
                        //var props = queryModelBodyClause.ToString().Split('.').Skip(1).ToList();
                    }
                }


                _queryParts.AddWherePart(GetPsqlExpression(whereClause.Predicate));
            }
            else
            {
                _queryParts.AddWherePart(GetPsqlExpression(whereClause.Predicate));
            }
            //_queryParts.AddWherePart(GetPsqlExpression(whereClause.Predicate));
            base.VisitWhereClause(whereClause, queryModel, index);
        }
        /// Creates an instance of the PsqlGeneratingExpressionVisitor based on this PsqlGeneratingQueryModelVisitor instance to visit the LINQ expression provided as an argument and to generate a corresponding part of the PostgreSQL query.

        private string GetPsqlExpression(Expression expression)
        {
            return(PsqlGeneratingExpressionVisitor.GetPsqlExpression(expression, this));
        }
 /// Visits the QueryModel nested in a SubQueryExpression using this PsqlGeneratingQueryModelVisitor.
 private void VisitSubQueryExpression(Expression expression)
 {
     PsqlGeneratingExpressionVisitor.GetPsqlExpression(expression, this);
 }