2009-03-09 17 views
13

"Method 'Boolean Contains(System.String)'にはSQLへの変換がサポートされていません。メソッド 'Boolean Contains(System.String)'にはSQLへの変換がサポートされていません

クエリはIsQueryableですが、これは動作を停止:

foreach (string s in collection1) 
{ 
     if (s.Length > 0) 
       { 
        query = query.Where(m => m.collection2.Contains(s)); 

       } 
} 

UPDATE:私はクエリ "IEnumerableを" の代わりにIQueryableを作るとき、それが動作します。ループを繰り返し処理する代わりにlinqを使って同じ結果を得る方法は何でしょうか?

+0

は、あなたはそれがこのループに入る前に、あなたのクエリが何であるかを投稿することができますか? –

+0

純粋なLINQを使用しても何も変わりません - 同じ問題があります。理由が不明なため、LINQが "奇妙な"コレクションをHashSetとして検出してIEnumerableとして使用しない場合、ユーザーは自分のコレクションを直接IEnumerableに変換しなければなりません - 次にContaintsはSQLに正しく変換されます。 – greenoldman

答えて

0

あなたが見ているエラーは、コレクションコレクション2から来ているようです。trueまたはfalseを返す別の関数でm.collection2をラップしてみましたか?このLINQ構文ですか?

2

これを見てくださいanswerからstackoverflowから。

結果のクエリでは、データベース には情報がメモリに格納されているため、データベースにアクセスできないように見えるようです。

+0

それにもかかわらず、メモリ内のデータは、他のクエリと同様にSQL Serverに転送できます。 ContainsはINに変換する必要があります。 – greenoldman

1

m.collection2はデータベースに含まれているため、Containsは使用しないでください。使用しているすべての

m.collection2.Any(x => x == s) 
21

はこれを試してみてください:

query = query.Where(m => m.collection2.ToList().Contains(s)); 
             ^^^^^^^^ 
+2

+1 - SQLのIN句を生成するためにLINQを取得すると、コレクションのコンパイル時*タイプは* List *である必要があります。私のテストでは、リストのインスタンスを持っていましたが、クエリではIList としてそれを見て、質問に記載されているエラーが発生しました。ただし、コンパイル時にリストとしてクエリが確認されたことを確認してください。 –

関連する問題