【问题标题】:Full Search testing in LINQ (custom filter query)LINQ 中的完整搜索测试(自定义过滤器查询)
【发布时间】:2010-09-30 00:52:13
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: linq tdd full-text-search


    【解决方案1】:

    我不知道这会影响你的测试,但 LinqtoSQL 可以通过一些调整来处理全文索引:

    【讨论】:

      【解决方案2】:

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

      • 简单搜索特定字词或短语
      • 词库搜索单词的同义词形式——在 IE 上搜索可能会返回 Internet Explorer 和 IE(基于词库的扩展搜索);在 Bombay 上进行搜索也可能将匹配结果返回到 Mumbai(基于词库的替换搜索)
      • 搜索将返回单词的所有不同语言形式(称为代数)搜索 bank 将返回命中 bank、banked、banks、banks' 和 bank's 等(搜索词 bank 的所有变格和/或变位)
      • 重音不敏感搜索 - 搜索 cafe 会将点击返回到 cafe 和 cafe

      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/

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多