protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            if (node.Method.DeclaringType == typeof(Queryable) &&
                node.Method.Name == "Where")
            {
                var predicate = node.Arguments[1];
                Visit(predicate);

                return(node);
            }

            switch (node.Method.Name)
            {
            case "Contains":
                _action = TranslatorAction.Contains;
                break;

            case "StartsWith":
                _action = TranslatorAction.StartsWith;
                break;

            case "EndsWith":
                _action = TranslatorAction.EndsWith;
                break;
            }

            return(base.VisitMethodCall(node));
        }
        protected override Expression VisitConstant(ConstantExpression node)
        {
            switch (_action)
            {
            case TranslatorAction.Default:
                _resultStringBuilder.Append($"({node.Value})\"");
                break;

            case TranslatorAction.Contains:
                _resultStringBuilder.Append($"(*{node.Value}*)\"");
                break;

            case TranslatorAction.StartsWith:
                _resultStringBuilder.Append($"({node.Value}*)\"");
                break;

            case TranslatorAction.EndsWith:
                _resultStringBuilder.Append($"(*{node.Value})\"");
                break;

            default:
                throw new NotSupportedException($"Operation '{_action}' is not supported");
            }

            _action = TranslatorAction.Default;

            return(node);
        }
 public ExpressionToFtsRequestTranslator()
 {
     _resultStringBuilder = new StringBuilder();
     _action = TranslatorAction.Default;
 }