Co zwraca LINQ, gdy wyniki są puste


319

Mam pytanie dotyczące zapytania LINQ. Zwykle zapytanie zwraca IEnumerable<T>typ. Jeśli zwrot jest pusty, nie wiem, czy jest on zerowy, czy nie. Nie jestem pewien, czy poniższe ToList()zgłoszenie wyrzuci wyjątek, czy po prostu pusty, List<string>jeśli wynik nie zostanie znaleziony IEnumerable?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Wiem, że to bardzo proste pytanie, ale na razie nie mam VS.


11
Myślę, że wynik jest wyliczalny. Pusty?
David.Chu.ca

Odpowiedzi:


512

Zwróci pusty wyliczalny. To nie będzie zero. Możesz spać dźwięk :)


38

Możesz także sprawdzić .Any()metodę:

if (!YourResult.Any())

Tylko uwaga, .Anyktóra nadal pobierze rekordy z bazy danych; wykonanie .FirstOrDefault()/.Where()będzie tak samo narzutem, ale będziesz w stanie złapać obiekty zwrócone z zapytania


5
Gdzie pytanie wspomina o bazie danych?
cja

4
Będziesz musiał zapytać tego, który edytował, nie wspominałem o żadnej DB :)
Noich

Edytor punktów sprawia, że ​​jest zdrowy, DB, czy nie. Wierzę, że mówią, że .Any()po prostu powie ci, czy masz w ogóle jakieś pasujące rekordy, gdzie wykonanie rzeczywistego zapytania w celu znalezienia określonej wartości może być zerowe, gdy .Any()nie jest.
vapcguy

1
Edycja może być naprawdę niepoprawna. Jeśli używasz linq do encji, db może to skrócić i żadne dane nie są wysyłane do klienta, z wyjątkiem prawdziwej lub fałszywej
Mafii

19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(Zrzut pochodzi z LinqPad )


Dokładnie! Lepsze wskazanie wyników
netfed

TIL Count()to także metoda, a nie tylko właściwość
hejNow

2
Nie powinieneś używać .Any (), ponieważ liczba będzie wyliczać wszystkie pozycje?
SHEePYTaGGeRNeP


8

W Linq-to-SQL, jeśli spróbujesz uzyskać pierwszy element zapytania bez rezultatów, pojawi się sequence contains no elementsbłąd. Zapewniam cię, że wspomniany błąd nie jest równy object reference not set to an instance of an object. podsumowując nie, nie zwróci wartości null, ponieważ null nie może powiedzieć, sequence contains no elementsże zawsze będzie mówić object reference not set to an instance of an object;)


1
Och, twoje wyjaśnienie pomaga w dalszym zrozumieniu. Dziękuję Ci !
Kay Lee,

Czy to odpowiada na pytanie?
ChiefTwoPencils

7

Inne posty tutaj wyjaśniły, że wynikiem jest „pusty” IQueryable, który ToList () poprawnie zmieni na pustą listę itp.

Bądź ostrożny z niektórymi operatorami, ponieważ będą rzucać, jeśli wyślesz im pustą listę. Może się to zdarzyć, gdy połączysz je razem.


3
„Bądź ostrożny z niektórymi operatorami, ponieważ rzucą ci, jeśli wyślesz im pustą wyliczenie. Może się to zdarzyć, gdy połączysz ich w sieć”. - To mnie ma. Miałem wartość zerową, którą następnie wprowadziłem do innego zapytania. Spowodowało to, że drugie zapytanie zostało rzucone bez względu na to, do czego go rzuciłem, ponieważ do drugiego zapytania nie wprowadzono żadnej wartości.
trevorc

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.