4

いくつかのキーワードで本のデータベースを検索したい。私が提供するキーワードが多ければ多いほど、検索は狭くなります。これが私のコードです:

var words = text.Split(' ');

IQueryable<Reference> query = null;

foreach (string word in words)
{
    var result = from r in _dbConnection.GetTable<Reference>()
                 where r.Title.Contains(word)
                 || r.ReferenceAuthor.Any(a => a.Person.LastName.Contains(word) || a.Person.FirstName.Contains(word))
                 || r.ReferenceCategory.Any(c => c.Category.Name.Contains(word))
                 || r.ReferenceKeyword.Any(k => k.Keyword.Name.Contains(word))
                 orderby r.Title
                 select r;

    query = query == null ? result : query.Intersect(result);
}

query.OrderBy(r => r.Title);

問題は、私が提供するキーワードが多ければ多いほど、検索が実際に狭くならないことです。キーワードを提供する順序によっても結果は異なります。また、複数のキーワードが含まれている場合、その最後のOrderBy()呼び出しは確実に機能しません。私のアイデアには欠陥がありますか、それとも実装方法ですか?

4

1 に答える 1

5

変数を閉じて、word変更された閉じの問題へのアクセスに遭遇しています。

ループを繰り返すたびに、wordsコレクションから変数に文字列の値をキャプチャしますword。ただし、LINQは遅延実行を使用し、ループが完了するまでクエリは実行されません。ループが完了すると、クエリのすべてのインスタンスで同じ単語変数がキャプチャされます。したがって、提供された検索キーワードの順序によって結果が異なることがわかります。 。

これを修正するには、ループの各反復で変数のローカルコピーを取得します。

foreach (string w in words)
{
    string word = w;
    ...
于 2011-03-21T08:26:14.930 に答える