2013-06-15 4 views
-1

J'ai une propriété List de type string. Je voudrais rechercher ma base de données pour m'assurer que la liste correspond aux résultats. Par exemple:requête linq pour les listes de recherche

List<string>strings = new List<string>({"test1","test2","etc"}); 

Je voudrais maintenant faire une recherche dans ma base de données en utilisant LINQ pour vérifier si sous certaines conditions que ces chaînes existent.

_databaseContext.Names.Where(x=>x.name == strings && specialID == 1); 
+2

Quel est le problème ou la question? – Amy

+0

@Amy il y a un problème dans sa clause where bien que je ne sais pas si c'est son problème. – evanmcdonnal

+0

Consultez http://stackoverflow.com/questions/4172195/mysql-like-multiple-values ​​(aussi pour MySQL) pour voir quel type de requête vous pourriez avoir besoin (conditions OR'ed). –

Répondre

2
_databaseContext.Names.Where(x => strings.Contains(x.name) && specialID == 1); 

Si votre liste de chaînes est unique, l'utilisation peut utiliser HashSet<> au lieu de List<>. Je pense que cela vous donnera de meilleures performances.

HashSet<string> hs = new HashSet<string> { "test1", "test2", "etc" }; 

_databaseContext.Names.Where(x => hs.Contains(x.name) && specialID == 1); 

EDIT: +1 à Alexei Levenkov pour pointer OUT- Exists causera des problèmes, devrait utiliser Contains à la place. En outre, vérifié la même requête générée pour List ainsi que HashSet donc dans le cas où vous souhaitez interroger sur le serveur, peu importe si vous utilisez List ou HashSet.

La requête générée sera quelque chose comme.

Select [name], [other columns] 
From Names 
Where [name] IN (N'test1', N'test2', N'etc') 

Cependant, en supposant specialID est variable locale, il va générer une requête dynamique similaire ci-dessus, mais aussi passer sa valeur à SQL Server. Cette requête est exécutée à l'aide de sp_executesql.

+1

+0: Je ne suis pas sûr que cela ne force pas la requête à être exécutée principalement sur le client en raison de l'appel de fonction dans le prédicat. –

+0

@AlexeiLevenkov: Merci beaucoup de l'avoir signalé. Réponse mise à jour – YK1