2009-03-09 3 views
13

"Methode 'Boolean Enthält (System.String)' hat keine unterstützte Übersetzung in SQL."Methode 'Boolean Enthält (System.String)' hat keine unterstützte Übersetzung in SQL

Abfrage ist IsQueryable aber das funktioniert nicht:

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

       } 
} 

UPDATE: es funktioniert, wenn ich Abfrage "IEnumerable" machen statt IQueryable. Was wäre der Weg, um dasselbe Ergebnis mit linq zu erhalten, anstatt die Schleife zu durchlaufen?

+0

Können Sie nach, was Ihre Frage ist, bevor es in dieser Schleife geht? –

+0

Mit reinem LINQ ändert sich nichts - es hat auch das gleiche Problem. Aus unbekanntem Grund, wenn LINQ "seltsame" Sammlung als HashSet erkennt, wird sie nicht als IEnumerable verwendet, der Benutzer muss seine Sammlung direkt in IEnumerable konvertieren - dann wird Containts korrekt in SQL übersetzt (IN ich nehme an). – greenoldman

Antwort

0

Es sieht so aus, als käme der Fehler, den Sie sehen, von der Sammlungssammlung 2. Haben Sie versucht, m.collection2 in eine andere Funktion zu verpacken, die true oder false zurückgibt? Ist das LINQ Syntax?

2

Werfen Sie einen Blick auf diese answer von stackoverflow.

Es sieht so aus, als müsste die resultierende Abfrage Zugriff auf etwas haben, das die Datenbank nicht erreichen kann, weil die Information im Speicher ist.

+0

Trotzdem können die Daten im Speicher wie jede andere Abfrage an SQL Server übertragen werden. Enthält sollte in IN übersetzt werden. – greenoldman

1

Da sich m.collection2 in der Datenbank befindet, sollten Sie Contains nicht verwenden. Alle

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

das Probieren:

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

+1 - Es scheint, dass, um LINQ zu SQL zu erhalten, um eine SQL 'IN' Klausel zu generieren, der * Kompilierungszeit * Typ Ihrer Sammlung eine * Liste * sein muss. In meinen Tests hatte ich eine Instanz der Liste , aber die Abfrage sah es als IList und ich habe den Fehler in der Frage erwähnt. Sicherzustellen, dass die Abfrage es als eine Liste zur Kompilierungszeit sah, reparierte es jedoch. –

Verwandte Themen