Ich habe eine Liste mit IDs meiner UserProfile
Tabelle. Wie kann ich alle UserProfiles
basierend auf der Liste der IDs auswählen, die ich in einer var
Verwendung erhalten habe LINQ
?
var idList = new int[1, 2, 3, 4, 5];
var userProfiles = _dataContext.UserProfile.Where(......);
Ich bin genau hier festgefahren. Ich kann dies mit for-Schleifen usw. tun LINQ
. Aber ich würde dies lieber mit tun .
Antworten:
Sie können dafür verwenden
Contains()
. Es wird sich ein wenig rückwärts anfühlen, wenn Sie wirklich versuchen, eineIN
Klausel zu erstellen , aber dies sollte es tun:Ich gehe auch davon aus, dass jeder
UserProfile
Datensatz einint
Id
Feld haben wird. Wenn dies nicht der Fall ist, müssen Sie entsprechend anpassen.quelle
Contains()
wird diese Gleichheitsprüfung für jedenid
Wert durchführen, wenn Sie ihn so verwenden, wie ich es in der Antwort geschrieben habe. Sie müssen==
nirgendwo explizit schreiben , wenn Sie versuchen, die Elemente eines Satzes (des Arrays) mit einem anderen (der Datenbanktabelle) zu vergleichen.Die Lösung mit .Where und .Contains hat eine Komplexität von O (N Quadrat). Simple .Join sollte eine viel bessere Leistung haben (nahe an O (N) aufgrund von Hashing). Der richtige Code lautet also:
Und jetzt Ergebnis meiner Messung. Ich habe 100 000 UserProfiles und 100 000 IDs generiert. Der Beitritt dauerte 32ms und .Wo mit .Contains dauerte 2 Minuten und 19 Sekunden! Ich habe für diese Tests reines IEnumerable verwendet, um meine Aussage zu beweisen. Wenn Sie List anstelle von IEnumerable verwenden, sind .Where und .Contains schneller. Auf jeden Fall ist der Unterschied signifikant. Die schnellste .Wo .Contains ist mit Set <>. Alles hängt von der Komplexität der zugrunde liegenden Coletions für .Contains ab. Schauen Sie sich diesen Beitrag an, um mehr über die Komplexität von Linq zu erfahren. Schauen Sie sich mein Testbeispiel unten an:
Konsolenausgabe:
quelle
List
verwendet werden. +1Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
Fehlermeldung bei der Verwendung von LINQ2SQL-Datenkontext.Schöne Antworten oben, aber vergessen Sie nicht eine WICHTIGE Sache - sie liefern unterschiedliche Ergebnisse!
Dies gibt 2 Zeilen aus der Datenbank zurück (und dies könnte korrekt sein, wenn Sie nur eine eindeutige sortierte Liste von Benutzern wünschen).
ABER in vielen Fällen möchten Sie möglicherweise eine unsortierte Ergebnisliste. Sie müssen immer wie bei einer SQL-Abfrage darüber nachdenken. Das Beispiel mit dem Warenkorb von eshop zeigt, was los ist:
Dies gibt 5 Ergebnisse von DB zurück. Die Verwendung von 'enthält' wäre in diesem Fall falsch.
quelle
Das sollte einfach sein. Versuche dies:
quelle