2

レストラン名のリストと、料理の種類を保持する別のテーブルへのリンクを含むテーブルがあります。

入力時に各単語がデータベースで検索され、結果が返される検索ボックスを Web ページに提供したいと考えています。Linq to SQL を使用してこれをテストできるようにしたいので、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

1

全文検索を使用しても、LINQ to SQL を引き続き使用できます。ストアド プロシージャを作成し、LINQ で呼び出すことができます。完全一致を見つけることに加えて、以下を返すことができます。

  • 特定の単語やフレーズの簡単な検索
  • シソーラスは単語の同義語を検索します。IE で検索すると、Internet Explorer と IE にヒットが返される場合があります (シソーラス ベースの拡張検索)。Bombay で検索すると、Mumbai のヒットも返される場合があります (シソーラス ベースの置換検索)。
  • bank で単語のすべての異なる言語形式 (世代と呼ばれる) を返す検索は、banking、banked、banks、banks'、bank's などのヒットを返します (すべての検索用語 bank の語形変化および/または活用)。
  • アクセントを付けない検索 – café で検索すると、cafe と café がヒットします

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrifying-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

これはおそらく最善の方法ではありませんが、検索テキストを常に 3 つの配列に分割された文字列として取得している場合は、次の方法を試してみてください。

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 に答える