文字列のリストをLINQ-to-SQLに送信できると思いますcontains
。
私は間違っていた。しかし、あなたができることは巨大なWhere
節を作ることです。比較する文字列がたくさんある場合は、これはお勧めしませんが、テストして確認してください。
var strings = TextBox1.Text.Split(' ').ToList();
var query = from product in dc.catalog select product;
foreach (var s in strings)
{
query = query.Where(product => product.Name.Contains(s));
}
return query;
これは次のようなものを作成します
var query = from product in dc.catalog
where product.Name.Contains(string1)
where product.Name.Contains(string2)
where product.Name.Contains(string3)
// etc
select product;
かなりひどいですが、文字列が少ない場合は問題ないかもしれません。
更新:ループがどのように機能するかを説明するためにforeach
、元のクエリを検討してください
from product in dc.catalog select product
テキストボックスに「HelloWorld」が含まれているとします。それをのようなリストに分割してから、リスト{ "Hello", "World" }
を繰り返します。
リストの最初は「こんにちは」です。この行query = query.Where(product => product.Name.Contains(s));
により、式は次のようになります。
from product in dc.catalog select product
.Where(product => product.Name.Contains("Hello"))
まだ実行されていません-これは単なる式ツリーです-しかし、Where
は元のクエリにタグ付けされています。
二つ目は「世界」で、表現が追加されています
from product in dc.catalog select product
.Where(product => product.Name.Contains("Hello"))
.Where(product => product.Name.Contains("World"))
これは「ContainsHello&&World」と同じようには読み取れませんが、論理的には同等ですproduct
。「Hello」が含まれているかどうかがテストされ、含まれている場合は「World」が含まれているかどうかがテストされます。 。'pass'には両方が含まれている必要があります。
このような式の連結は、文字列の連結とまったく同じです。
var letters = new List<string>(){ "H", "e", "l", "l", "o" };
string result = ""
foreach (var letter in letters)
{
result = result + letter;
}
の値はresult
「o」にはなりません。「こんにちは」になります。