Поисковый запрос с помощью Subsonic - PullRequest
0 голосов
/ 21 июня 2009

Хорошо,

Сегодня я пытаюсь выучить Subsonic. Довольно классные вещи.

Я пытаюсь встроить некоторые функции поиска в свой веб-сайт, но изо всех сил пытаюсь добиться этого в Subsonic.

У меня есть одно поле поиска, которое может содержать несколько ключевых слов. Я хочу вернуть результаты, которые соответствуют всем ключевым словам. Цель поиска - один текстовый столбец.

Пока у меня есть это (оно работает, но никогда не возвращает результаты):

return new SubSonic.Select().From(Visit.Schema)
            .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
            .Where(InfopathArchive.XmlDocColumn).Like(keywords)
            .ExecuteTypedList<Visit>();      

Между таблицей посещений и таблицей InfoPathArchive существует однозначное соответствие. Я просто хочу вернуть коллекцию посещений с ключевыми словами в связанном XMLDocColumn.

Если бы я мог заставить это работать, было бы здорово. Теперь вторая проблема заключается в том, что если кто-то ищет «australia processmodel», то, очевидно, приведенный выше код должен возвращать только эту точную фразу. Как создать запрос, который разделяет мой поисковый запрос, чтобы он возвращал документы, содержащие ВСЕ отдельные поисковые термины?

Любая помощь приветствуется.

Редактировать: Хорошо, так что основной поиск работает, но поиск по нескольким ключевым словам - нет. Я сделал то, что предложил Адам, но кажется, что Subsonic использует только один параметр для запроса.

Вот код:

        List<string> wordsInQueryList = keywords.Split(' ').ToList();

        SqlQuery q = Select.AllColumnsFrom<Visit>()
            .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
            .Where(Visit.IsDeletedColumn).IsEqualTo(false);

        foreach(string wordInQuery in wordsInQueryList)
        {
            q = q.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%");
        }

return q.ExecuteTypedList ();

Тогда, если я посмотрю на запрос, который генерирует Subsonic:

SELECT (bunch of columns)

 FROM [dbo].[Visit]
 INNER JOIN [dbo].[InfopathArchive] ON [dbo].[Visit].[VisitId] = [dbo].[InfopathArchive].[VisitId]
 WHERE [dbo].[Visit].[IsDeleted] = @IsDeleted
 AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc
 AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc

В итоге получается, что ищется только последнее ключевое слово.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 21 июня 2009

Вы можете делать то, что предлагает Адам, или с 2.2 вы можете просто использовать "Contains ()" вместо Like ("% ...%"). Мы также поддерживаем StartsWith и EndsWith ():)

1 голос
/ 21 июня 2009

Первый вопрос:

return new SubSonic.Select().From(Visit.Schema)
        .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
        .Where(InfopathArchive.XmlDocColumn).Like("%" + keywords + "%")
        .ExecuteTypedList<Visit>();

Второй вопрос:

Передайте список слов в вашем запросе функции, которая создает запрос SubSonic, следующим образом

SqlQuery query = DB.Select().From(Visit.Schema)
        .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
        .Where("1=1");

foreach(string wordInQuery in wordsInQueryList)
{
  query = query.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%")
}

return query.ExecuteTypedList<Visit>();

Очевидно, что это не проверено, но оно должно указать вам правильное направление.

...