Mam listę zawierającą identyfikatory mojego UserProfile
stołu. Jak mogę wybrać wszystko UserProfiles
na podstawie listy identyfikatorów, które mam w var
użyciu LINQ
?
var idList = new int[1, 2, 3, 4, 5];
var userProfiles = _dataContext.UserProfile.Where(......);
Utknąłem tutaj. Mogę to zrobić używając pętli for itp. Ale wolałbym to zrobić z LINQ
.
Odpowiedzi:
Możesz użyć
Contains()
do tego. Będzie to trochę cofnięte, gdy naprawdę próbujesz stworzyćIN
klauzulę, ale powinno to wystarczyć:Zakładam też, że każdy
UserProfile
rekord będzie miałint
Id
pole. Jeśli tak nie jest, musisz odpowiednio dostosować.źródło
Contains()
obsłuży to sprawdzenie równości dla każdejid
wartości, jeśli użyjesz jej tak, jak napisałem w odpowiedzi. Nie musisz==
nigdzie jawnie pisać, gdy próbujesz porównać elementy jednego zestawu (tablicy) z innym (tabela bazy danych).Rozwiązanie z .Where i .Contains ma złożoność O (N kwadrat). Prosty .Join powinien mieć dużo lepszą wydajność (blisko O (N) ze względu na haszowanie). Więc poprawny kod to:
A teraz wynik mojego pomiaru. Wygenerowałem 100 000 profili użytkowników i 100 000 identyfikatorów. Dołączenie zajęło 32 ms, a gdzie z .Contains zajęło 2 minuty i 19 sekund! Użyłem czystego IEnumerable do tego testu, aby udowodnić moje stwierdzenie. Jeśli używasz listy zamiast IEnumerable, .Where i .Contains będą działać szybciej. Zresztą różnica jest znacząca. Najszybszy .Gdzie .Contains to Set <>. Wszystko zależy od złożoności bazowych kolekcji dla .Contains. Spójrz na ten post, aby dowiedzieć się o złożoności linq Spójrz na moją próbkę testową poniżej:
Wyjście konsoli:
źródło
List
jest używany. +1Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
Podczas korzystania z kontekstu danych LINQ2SQL pojawia się błąd.Ładne odpowiedzi powyżej, ale nie zapominaj o jednej WAŻNE - dają różne wyniki!
Spowoduje to zwrócenie 2 wierszy z bazy danych (i może to być poprawne, jeśli chcesz mieć tylko odrębną posortowaną listę użytkowników)
ALE w wielu przypadkach możesz potrzebować niesortowanej listy wyników. Zawsze musisz myśleć o tym jak o zapytaniu SQL. Zobacz przykład z koszykiem sklepu internetowego, aby zilustrować, co się dzieje:
To zwróci 5 wyników z DB. W tym przypadku użycie atrybutu „zawiera” byłoby niewłaściwe.
źródło
To powinno być proste. Spróbuj tego:
źródło