2

我有一张桌子,上面有餐厅名称列表和指向另一个包含美食类型的桌子的链接。

我想在我的网页上提供一个搜索框,在输入时,会在数据库中搜索每个单词并返回结果。我正在寻找一种不涉及设置 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

这对搜索字段进行了硬编码,然后遍历搜索文本中的每个单词以构造 OR LIKE 过滤器。

我确信我可以在我的 LINQ 代码中使用它,但它似乎不是一个优雅的解决方案,特别是因为这些列是硬编码的,并且没有使用 LINQ 如何使用它们。

任何人都可以推荐一种更好的方法来做到这一点,或者在这个方向上提供一些提示吗?

谢谢

4

3 回答 3

2

我不知道这会影响您的测试,但可以使 LinqtoSQL 与全文索引一起工作,只需稍作调整:

于 2009-01-07T13:34:18.283 回答
1

您可以使用全文搜索并仍然使用 LINQ to SQL。您可以创建一个存储过程并让 LINQ 调用它。除了找到完全匹配之外,您还可以返回:

  • 简单搜索特定单词或短语
  • 词库搜索单词的同义词形式——在 IE 上搜索可能会返回对 Internet Explorer 和 IE 的点击(基于词库的扩展搜索);在 Bombay 上的搜索也可能返回 Mumbai 的命中(基于词库的替换搜索)
  • 将返回单词的所有不同语言形式(称为代数)的搜索对 bank 的搜索将返回对银行、银行、银行、银行和银行等的命中(搜索词银行的所有变格和/或变位)
  • 口音不敏感的搜索 - 对咖啡馆的搜索会将点击返回到咖啡馆和咖啡馆

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

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

于 2009-01-07T17:33:38.707 回答
0

这可能不是最好的方法,但如果你总是将搜索文本作为字符串拆分为三个数组,那么你可以尝试使用这个:

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

我通常做 C#,所以 VB 中的任何东西都很自然,但我认为 LINQ 语法应该是相似的

于 2009-01-07T17:02:25.930 回答