2015-07-27 11 views
6

Ho un hashset di stringhe che rappresenta tmdbId's per i film che ho sul disco - chiamato moviesOnDisk.LINQ to SQL: "Metodo 'Boolean Contains (System.String)' non ha traduzione supportata in SQL."

Ho un database di oggetti filmato, indicizzato su tmdbId.

Voglio eliminare i record che esistono nel database ma non esistono sul disco.

ho questa linea per ottenere la differenza:

var toDelete = Database.Movies.Where(x => !moviesOnDisk.Contains(x.TMDbId)); 

questo mi dà alcun risultato e il seguente messaggio:

Metodo 'booleana Contiene (System.String)' non ha alcuna traduzione supportato a SQL.

C'è un lavoro da fare per questo? Ovviamente posso scorrere su entrambe le liste, ma sto andando per la migliore prestazione.

+0

var = toDelete Database.Movies.Where (x =>! MoviesOnDisk) .Contains (x.TMDbId); –

+0

La tua dichiarazione dovrebbe funzionare. 'moviesOnDisk' è sicuramente un' HashSet ', giusto? – Rob

+0

sì è - Sono davvero confuso perché sta generando un'eccezione ... – user3689167

risposta

-1

cambia filmatiOnDisk su array, funzionerà.
il tipo di elemento della matrice deve essere uguale a TMDbId

4

Modificare la clausola where in !moviesOnDisk.ToList().Contains(x.TMDbId).

@ Rob fornito un grande spiegazione nei commenti sul perché Contains funziona su IEnumerable, ma non su un HashSet:

Funziona perché è Contiene un'implementazione specifica sul HashSet. Quando si traduce in SQL, ha una serie di metodi supportati , incluso Queryable.Contains() - che è un metodo diverso da ciò che hai scritto. HashSet.Contains ha una diversa implementazione (vale a dire, il valore di hashing e fare una ricerca), e non possono essere convertiti a SQL

+2

Se la prestazione è un problema, raccomanderei '.AsEnumerable()' invece di '.ToList()' - la ragione è che '.ToList()' enumera 'HashSet' , compilare la lista e quindi il generatore SQL enumererà nuovamente la lista - mentre si esegue il cast di 'IEnumerable' o usando' .AsEnumerable() 'salterà la prima enumerazione e la rinvierà al generatore SQL :) – Rob

+0

Concordato. Sono troppo abituato a usare 'ToList' su tutto :) Risolto. –

+0

@Rob, ti dispiace postare il tuo commento come risposta? È la tua soluzione davvero. Volevo solo avere una risposta adeguata alle domande per seguire le pratiche di Q & A. –

Problemi correlati