2009-03-09 3 views
13

"Méthode" Boolean Contient (System.String) 'n'a pas de traduction prise en charge par SQL. "La méthode 'Boolean Contient (System.String)' n'a pas de traduction prise en charge en SQL

requête est IsQueryable mais cela a cessé de fonctionner:

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

       } 
} 

MISE À JOUR: cela fonctionne quand je fais requête "IEnumerable" au lieu de IQueryable. Quel serait le moyen d'obtenir le même résultat en utilisant linq au lieu d'itérer en boucle?

+0

Pouvez-vous envoyer ce que votre requête est avant qu'elle ne passe dans cette boucle? –

+0

L'utilisation de LINQ pur ne change rien - il a aussi le même problème. Pour une raison inconnue, si LINQ détecte "étrange" collection comme HashSet il ne l'utilise pas comme IEnumerable, l'utilisateur doit convertir sa collection directement à IEnumerable - puis Containts est correctement traduit en SQL (IN je suppose). – greenoldman

Répondre

0

Il semble que l'erreur que vous voyez provienne de la collection 2. Avez-vous essayé d'encapsuler m.collection2 dans une autre fonction qui renvoie true ou false? Est-ce la syntaxe LINQ?

2

Jetez un oeil à ce answer de stackoverflow.

Il semble que la requête résultante nécessite un accès à quelque chose que la base de données n'a aucun moyen d'atteindre, car l'information est en mémoire.

+0

Néanmoins les données en mémoire, peuvent être transférées à SQL Server, comme toute autre requête. Contient devrait être traduit en IN. – greenoldman

1

Étant donné que m.collection2 est dans la base de données, n'utilisez pas Contains. Utilisez Tout

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

Essayez ceci:

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

+1 - Il semble que pour obtenir LINQ to SQL afin de générer une clause SQL 'IN', le type * compile time * de votre collection doit être un * Liste *. Dans mes tests, j'ai eu une instance de la liste , mais la requête l'a vu comme un IList et j'ai eu l'erreur mentionnée dans la question. Toutefois, s'assurer que la requête l'a vu comme une liste au moment de la compilation l'a corrigé. –

Questions connexes