Тестирование полного поиска в LINQ (запрос пользовательского фильтра)

StackOverflow https://stackoverflow.com/questions/420299

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Я хочу разместить на своей веб-странице окно поиска, в котором при вводе каждое слово ищется в базе данных и возвращает результаты.Я искал решение, которое не требует настройки полнотекстового поиска sql, поскольку я хочу иметь возможность протестировать это с помощью Linq to SQL.

Из моего старого кода у меня есть функция, которая создает фильтр запроса на основе входного текста и возвращает все результаты на его основе.

Private Function SetupQuery(ByVal searchText As String) As String
    Dim searchFields As New List(Of String)

    searchFields.Add("Name")
    searchFields.Add("Postcode")
    searchFields.Add("Cuisine")

    Dim firstCol As Boolean = True

    Dim a() As String
    Dim j As Integer
    a = searchText.Trim.Split(" ")

    Dim filter As String = ""

    Dim compareString As String
    For Each col As String In searchFields
        For j = 0 To a.GetUpperBound(0)
            compareString = a(j).ToUpper()
            compareString = compareString.Trim()

            If firstCol Then
                filter = filter & col & " LIKE '" & compareString & "%' "
                firstCol = False
            Else
                filter = filter & " or " & col & " LIKE '" & compareString & "%' "
            End If
        Next
    Next

    Return filter
End Function

При этом поля поиска жестко запрограммированы, а затем циклически проходится по каждому слову в тексте поиска, чтобы создать фильтр ИЛИ НРАВИТСЯ.

Я уверен, что затем я мог бы использовать это в своем коде LINQ, но это не кажется элегантным решением, особенно потому, что столбцы жестко запрограммированы и не используются так, как их использует LINQ.

Может ли кто-нибудь порекомендовать лучший способ сделать это или несколько советов, в каком направлении двигаться?

Спасибо

Это было полезно?

Решение

Вы можете использовать полнотекстовый поиск и при этом использовать LINQ to SQL.Вы можете создать хранимую процедуру и использовать LINQ для ее вызова.Помимо поиска точных совпадений, вы можете вернуть:

  • Простой поиск по конкретным словам или фразам
  • Тезаурус ищет синонимичные формы слов – поиск в IE может возвращать результаты в Internet Explorer и IE (расширенный поиск на основе тезауруса);поиск в Бомбее может также вернуть результаты в Мумбаи (поиск замены на основе тезауруса)
  • Поиски, которые вернут все различные лингвистические формы слова (называемые поколениями), поиск по банку будет возвращать совпадения с банковским делом, банком, банками, банками и банками и т. д.(все склонения и/или спряжения банка поисковых запросов)
  • Поиск без учета акцента: поиск по кафе вернет результаты к кафе и кафе.

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retriving-data-using-stored-procedures.aspx

http://www.simple-talk.com/sql/learn-sql-server/sql-server-full-text-search-language-features/

Другие советы

Я не знаю, как это повлияет на ваше тестирование, но LinqtoSQL можно заставить работать с полнотекстовым индексированием, приложив несколько усилий:

Вероятно, это не лучший способ сделать это, но если вы всегда получаете текст поиска в виде строки, разделенной на массив из трех, вы можете попробовать использовать это:

from t in temp
where t.Name == a(0)
|| t.Postcode == a(1)
|| t.Cuisine == a(2)
select t

Обычно я занимаюсь C#, поэтому, естественно, все в VB пугает, но я думаю, что синтаксис LINQ должен быть похожим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top