7

私が行っている Web サイトでは、LINQ to Entities を使用しています。サイトに検索機能を追加することで起訴されました。データベース内の単一のフィールドで複数のキーワード (ユーザーが入力したもの) を検索する最もエレガントな方法を見つけようとしています。例を挙げましょう。

表の列:

Name, Description

行の例:

"Cookie monster", "Fluffy, likes cookies and blue"

ユーザー検索 (区切り文字は関係ありません):

"blue fluffy" 

現在、私は以下を使用しています:

    public List<SesameCharacters> SearchByKeywords(string keywords)
    {
        List<SesameCharacters> output = new List<SesameCharacters>();
        string[] k = keywords.ToLower().Split(' ');
        using (SesameStreet_Entities entities = new SesameStreet_Entities())
        {
            IQueryable<SesameCharacters> filter = entities.SesameCharacters;

            foreach (string keyword in k)
                filter = ForceFilter(filter, keyword);

            output = filter.ToList();
        }
        return output;
    }

    private IQueryable<SesameCharacters> ForceFilter(IQueryable<SesameCharacters> filter, string keyword)
    {
        return filter.Where(p => p.Description.ToLower().Contains(keyword));
    }

これは現在期待どおりに機能しますが、問題に対する最善の解決策ではないと思います。明らかに明らかな何かが欠けていますか?

注:これはAND一致しています。

4

4 に答える 4

10

私はこれがうまくいったことを発見しました-これはEntity Framework 4.0でVB.Netを使用していますが、原則が翻訳されると確信しています.

これは「OR」スタイルのクエリを実行します。

    Function Search(ByVal query As String) As IQueryable(Of Product)
    Dim queryWords As String() = query.Split()
    Dim entities As New Entities()

    Return entities.Products.Where(Function(p) queryWords.Any(Function(w) p.Description.Contains(w)))
End Function

そして、これは「AND」スタイルのクエリを実行します:

Function Search(ByVal query As String) As IQueryable(Of product)
    Dim queryWords As String() = query.Split()
    Dim entities As New Entities()

    Return entities.Products.Where(Function(p) queryWords.All(Function(w) p.Description.Contains(w)))
End Function
于 2010-07-08T09:14:14.643 に答える
3

LinqtoEntitiesがサポートしていないようです。

http://msdn.microsoft.com/en-us/library/bb738638.aspx

私はこれについて自分のクエリをロールバックします。これらのタイプの検索がパフォーマンスの問題になることがわかった場合は、おそらくテキスト検索クエリを完全に制御する必要があります。

于 2009-02-18T05:09:35.553 に答える
1

代わりにどうですか:

IQueryable<SesameCharacters> filter = entities.SesameCharacters;

        foreach (string keyword in k)
            filter = ForceFilter(filter, keyword);

        output = filter.ToList();

行う:

return (from c in entities.SesameCharacters
         where k.Contains(c..Description.ToLower())
         select c
         ).ToList();
于 2009-02-20T22:19:20.947 に答える