2009-03-09 23 views
13

"Método 'Boolean Contains (System.String)' no tiene traducción soportada a SQL."Método 'Boolean Contains (System.String)' no tiene traducción soportada a SQL

consulta es IsQueryable pero esto dejó de funcionar:

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

       } 
} 

ACTUALIZACIÓN: funciona cuando hago consulta "IEnumerable" en lugar de IQueryable. ¿Cuál sería la forma de obtener el mismo resultado utilizando linq en lugar de iterar a través del ciclo?

+0

Se puede publicar lo que su consulta es antes de entrar en este bucle? –

+0

El uso de LINQ puro no cambia nada, también tiene el mismo problema. Por razones desconocidas, si LINQ detecta una colección "extraña" como HashSet, no la usa como IEnumerable, el usuario tiene que convertir su colección directamente a IEnumerable, entonces Containts se traduce correctamente a SQL (IN supongo). – greenoldman

Respuesta

0

Parece que el error que está viendo proviene de la colección de recopilación 2. ¿Ha intentado envolver el m.collection2 en otra función que devuelve verdadero o falso? ¿Es esta sintaxis LINQ?

2

Echa un vistazo a este answer de stackoverflow.

Parece que la consulta resultante necesitaría acceder a algo que la base de datos no tiene forma de alcanzar, porque la información está en la memoria.

+0

Sin embargo, los datos en la memoria se pueden transferir a SQL Server, como cualquier otra consulta. Contiene debe traducirse a IN. – greenoldman

1

Dado que m.collection2 está en la base de datos, no use Contiene. Utilizar cualquier

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

Prueba esto:

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

+1 - Parece que para obtener LINQ to SQL para generar una cláusula SQL 'IN', el tipo * compile time * de su colección debe ser * List *. En mis pruebas, tuve una instancia de List , pero la consulta lo vio como un IList y recibí el error mencionado en la pregunta. Sin embargo, asegurándose de que la consulta lo vio como una lista en tiempo de compilación, se arregló. –

Cuestiones relacionadas