public static Expression <Func <T, bool> > GetExpression <T>(
            ParsedSearchString parsedSearchString,
            string fieldName)
        {
            ParameterExpression param = Expression.Parameter(typeof(T));
            var member = Expression.Property(param, fieldName);

            //single expression
            if (parsedSearchString.SecondPredicate == null)
            {
                var expression = ApplyOperator(parsedSearchString.FirstPredicate, member);
                return(Expression.Lambda <Func <T, bool> >(expression, param));
            }

            //Two expressions
            if (parsedSearchString.IsAndOperator)
            {
                BinaryExpression expression = Expression.AndAlso(
                    ApplyOperator(parsedSearchString.FirstPredicate, member),
                    ApplyOperator(parsedSearchString.SecondPredicate, member));
                return(Expression.Lambda <Func <T, bool> >(expression, param));
            }
            else
            {
                BinaryExpression expression = Expression.OrElse(
                    ApplyOperator(parsedSearchString.FirstPredicate, member),
                    ApplyOperator(parsedSearchString.SecondPredicate, member));
                return(Expression.Lambda <Func <T, bool> >(expression, param));
            }
        }
        public IEnumerable <Notebook> SearchNotebooks(string searchString)
        {
            ParsedSearchString parsedSearchString = this._predicateParser.Parse(searchString);

            return(this._context
                   .NotebookList
                   .Where(QueryObject.GetExpression <Notebook>(parsedSearchString, nameof(Notebook.Name))));
        }