J'ai une liste contenant les identifiants de ma UserProfile
table. Comment puis-je tout sélectionner en UserProfiles
fonction de la liste des identifiants que j'ai obtenus lors d'une var
utilisation LINQ
?
var idList = new int[1, 2, 3, 4, 5];
var userProfiles = _dataContext.UserProfile.Where(......);
Je suis resté coincé ici. Je peux faire cela en utilisant des boucles for, etc. Mais je préfère le faire avec LINQ
.
Réponses:
Vous pouvez utiliser
Contains()
pour cela. Cela vous semblera un peu en arrière lorsque vous essayez vraiment de produire uneIN
clause, mais cela devrait le faire:Je suppose également que chaque
UserProfile
enregistrement aura unint
Id
champ. Si ce n'est pas le cas, vous devrez vous adapter en conséquence.la source
Contains()
gérera cette vérification d'égalité sur chaqueid
valeur si vous l'utilisez comme je l'ai écrit dans la réponse. Vous n'avez pas besoin d'écrire explicitement==
n'importe où lorsque vous essayez de comparer les éléments d'un ensemble (le tableau) à un autre (la table de base de données).Solution avec .Where et .Contains a une complexité de O (N carré). Simple .Join devrait avoir de bien meilleures performances (proche de O (N) en raison du hachage). Le code correct est donc:
Et maintenant résultat de ma mesure. J'ai généré 100 000 profils utilisateur et 100 000 identifiants. Join a pris 32ms et .Where avec .Contains a pris 2 minutes et 19 secondes! J'ai utilisé IEnumerable pur pour ce test pour prouver ma déclaration. Si vous utilisez List au lieu de IEnumerable, .Where et .Contains seront plus rapides. Quoi qu'il en soit, la différence est significative. Le .Where .Contains le plus rapide est avec Set <>. Tout cela dépend de la complexité des couleurs sous-jacentes pour .Contains. Regardez cet article pour en savoir plus sur la complexité de linq.Regardez mon exemple de test ci-dessous:
Sortie de la console:
la source
List
est utilisé. +1Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
erreur lors de l' utilisation de datacontext LINQ2SQL.Bonnes réponses, mais n'oubliez pas une chose IMPORTANTE - elles fournissent des résultats différents!
Cela renverra 2 lignes de DB (et cela pourrait être correct, si vous voulez juste une liste triée distincte d'utilisateurs)
MAIS dans de nombreux cas, vous pourriez vouloir une liste de résultats non triés . Vous devez toujours y penser comme une requête SQL. Veuillez consulter l'exemple avec le panier d'achat d'eshop pour illustrer ce qui se passe:
Cela renverra 5 résultats de DB. L'utilisation de «contient» serait erronée dans ce cas.
la source
Cela devrait être simple. Essaye ça:
la source