2

検索の入力としてフリー テキストを受け取るテキスト ボックスがあり、LINQこのタイプの検索で拡張したいクエリがあります。

入力は次のようなもの"big blue car"で、これらすべての単語を含むタイトルを検索するクエリになります。

「すべての単語」の代わりに「任意の単語」に切り替えるオプションもあります

LINQこれをクエリに追加する最良/最も簡単な方法は何ですか?

クエリは次のようになります

from b in books
where b.InStore == true && b.Price > 10 && title.Contains()...at this point i want to add the text search. 
select b
4

2 に答える 2

1

2 つのクエリで実行することを強くお勧めします。

でも、これを見てください、カッコいいですよね?

var searchAll = true;
var words = List<string>{"big", "blue", "car"};

from b in books
where (...) (searchAll && words.All(x => title.contains(x))) ||
            (!searchAll && words.Any(x => title.Contains(x)))
select b

しかし、実際には 2 つの異なるクエリで作成する必要があります。

于 2012-04-15T00:17:25.177 に答える
0

最初にクエリとタイトルを単語に分割してから、含まれているかどうかを確認します。ラフカットは

string[] queryParts = query.Split(' ');

books.Where(b => b.InStore)
    .Where(b => b.Price > 10)
    .Where(b => queryParts.Any(part => b.Title.Split(' ').Contains(part)))

any クエリの場合、および

string[] queryParts = query.Split(' ');

books.Where(b => b.InStore)
    .Where(b => b.Price > 10)
    .Where(b => queryParts.All(part => b.Title.Split(' ').Contains(part)))

all クエリの場合。

デフォルトのString.Containsメソッドは部分文字列の一致を探すため、タイトルを単語に分割する必要があります。

"ABC DEF".Contains("A")

を返しますがtrue、この目的のためにはそうしたくありません。

これらのソリューションは両方とも、単語が常にスペースで区切られていることを前提としていますが、これは一般的には当てはまりません。ユーザーは、単語の間にタブを入力したり、引用符を使用して単語のグループを区切ったりすることができます (例: "New York")。

于 2012-04-15T00:19:06.367 に答える