IQueryable <Message> FindAnywhere(string searchString)
        {
            var messages = FindByMessage(searchString)
                           .Union(FindBySeries(searchString));

            if (BibleReferenceValidation.Validate(searchString) == ValidationResult.Success)
            {
                messages = messages.Union(FindByBibleReference(searchString));
            }
            return(messages);
        }
        IQueryable <Message> FindByBibleReference(string searchString)
        {
            var validationResult = BibleReferenceValidation.Validate(searchString);
            var messages         = GetNoMessages();

            if (validationResult != ValidationResult.Success)
            {
                ViewData["SearchErrorMessage"] = validationResult.ErrorMessage;
                return(messages);
            }

            var bibleReferences = Parser.TryParse(searchString);

            if (bibleReferences != null && bibleReferences.Count == 1)
            {
                // x1 <= y2 && y1 <= x2
                var x = BibleReferenceRange.From(bibleReferences[0].GetExplicitRange());
                var matchingReferences = from y in _context.BibleReferences
                                         where (
                    (x.StartBook < y.EndBook) ||
                    (x.StartBook == y.EndBook && x.StartChapter < y.EndChapter) ||
                    (x.StartBook == y.EndBook && x.StartChapter == y.EndChapter && x.StartVerse <= y.EndVerse)
                    ) &&
                                         (
                    (y.StartBook < x.EndBook) ||
                    (y.StartBook == x.EndBook && y.StartChapter < x.EndChapter) ||
                    (y.StartBook == x.EndBook && y.StartChapter == x.EndChapter && y.StartVerse <= x.EndVerse)
                                         )
                                         select y;

                messages = GetAllMessages()
                           .Join(matchingReferences,
                                 m => m.Id,
                                 r => r.MessageId,
                                 (m, r) => m);
                foreach (var reference in matchingReferences)
                {
                    MatchingBibleReferences.Add(reference.ToFriendlyString());
                }
            }
            return(messages);
        }