2009-03-09 16 views
13

"Metoda" Boolean Contains (System.String) "nie obsługuje translacji do SQL."Metoda "Boolean Contains (System.String)" nie obsługuje tłumaczenia do SQL

zapytanie jest IsQueryable ale przestał działać:

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

       } 
} 

UPDATE: to działa, gdy robię zapytanie "IEnumerable" zamiast IQueryable. Jaki byłby sposób uzyskania tego samego wyniku przy użyciu linq zamiast iteracji przez pętlę?

+0

można pisać co zapytanie jest, zanim przejdzie do tej pętli? –

+0

Używanie czystego LINQ niczego nie zmienia - ma również ten sam problem. Z nieznanych przyczyn, jeśli LINQ wykryje "dziwną" kolekcję jako HashSet, nie używa jej jako IEnumerable, użytkownik musi przekonwertować swoją kolekcję bezpośrednio na IEnumerable - wtedy Containts jest poprawnie tłumaczony na SQL (IN I przypuszczam). – greenoldman

Odpowiedz

0

Wygląda na to, że błąd, który widzisz, pochodzi z kolekcji kolekcji 2. Czy próbowałeś owijać m.collection2 w inną funkcję, która zwraca wartość true lub false? Czy to jest składnia LINQ?

2

Spójrz na to answer od stackoverflow.

Wygląda na to, że wynikowe zapytanie będzie wymagało dostępu do czegoś, do czego nie ma dostępu baza danych , ponieważ informacje znajdują się w pamięci.

+0

Niemniej jednak dane w pamięci mogą być przesyłane do SQL Server, tak jak każde inne zapytanie. Contains powinno zostać przetłumaczone na IN. – greenoldman

1

Ponieważ m.collection2 znajduje się w bazie danych, nie należy używać opcji Contains. Użyj dowolnego

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

Spróbuj tego:

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

+1 - Wydaje się, że aby uzyskać LINQ do SQL, aby wygenerować klauzulę "IN" SQL, typem * czasu kompilacji * twojej kolekcji musi być * Lista *. W moich testach miałem instancję listy , ale zapytanie zobaczyło ją jako IList i otrzymałem błąd wspomniany w pytaniu. Jednak zapewnienie, że kwerenda zobaczyła go jako List podczas kompilacji, naprawiło go. –

Powiązane problemy