2

私の Linq クエリは次のエラーを返します:ローカル シーケンスは、Contains 演算子以外のクエリ演算子の LINQ to SQL 実装では使用できません

 var query = from product in dc.catalog
              where TextBox1.Text.Split(' ').All(s => product.Name.Contains(s))
              select product;

このエラーを回避するには、どのように書き直すことができますか?

4

3 に答える 3

1

文字列のリストを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」にはなりません。「こんにちは」になります。

于 2011-11-18T03:35:45.883 に答える
1

SQLに転送するのではなく、オブジェクトに対してクエリを実行するのが簡単な方法だと思います。

var query = from product in dc.catalog.ToList()
              where TextBox1.Text.Split(' ').All(s => product.Name.Contains(s))
              select product;

パフォーマンスの点では最高ではありませんが、データソースのサイズによって異なります。

于 2011-11-18T11:08:31.383 に答える
1

エラーが示すように、contains のみがサポートされています。INあなたのリストはSQL句に変わりました。
求めていることを行うには、LINQ が提供する遅延実行に依存し、名前に含まれるすべての単語をチェックする LINQ ステートメントを作成する必要があります。

var query = dc.catalog.AsQueryable();
foreach(var s in TextBox1.Text.Split(' ') {
  string copy = s;  // Take a local copy of the string. Lambda's inside loops are fun!
  query= query.Where(product => product.Name.Contains(copy));
}

編集:文字列のローカル コピーを取得して、ラムダのスコープの問題を回避できることを願っています。金曜日の午後 5 時に頭の中でコンパイルしました。まだ正しくない場合は申し訳ありません :)

于 2011-11-18T03:52:03.613 に答える