Oto przegląd różnych metod:
Find () - gdy chcesz uzyskać przedmiot za pomocą klucza podstawowego. Zwróci wartość null, jeśli nie może znaleźć elementu. Będzie wyglądać w kontekście przed przejściem do bazy danych (jak wskazał Yaron w komentarzach), co może być ważnym czynnikiem wydajności, jeśli chcesz uzyskać tę samą jednostkę wiele razy, podczas gdy ten sam kontekst jest żywy.
Single () - gdy spodziewasz się, że zapytanie zwróci dokładnie jeden element. Spowoduje to zgłoszenie wyjątku, jeśli zapytanie nie zwróci dokładnie jednego elementu.
SingleOrDefault () - gdy spodziewasz się, że zapytanie zwróci zero lub jeden element (czyli nie jesteś pewien, czy istnieje element o podanym kluczu). Spowoduje to zgłoszenie wyjątku, jeśli zapytanie nie zwróci zera lub jednego elementu.
First () - gdy oczekujesz, że zapytanie zwróci jeden lub więcej elementów, ale chcesz uzyskać dostęp tylko do pierwszego elementu w swoim kodzie (kolejność może być ważna w zapytaniu tutaj). Spowoduje to zgłoszenie wyjątku, jeśli zapytanie nie zwróci co najmniej jednego elementu.
FirstOrDefault () - gdy spodziewasz się, że zapytanie zwróci zero lub więcej elementów, ale chcesz uzyskać dostęp tylko do pierwszego elementu w swoim kodzie (tj. Nie jesteś pewien, czy istnieje element o podanym kluczu)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
alboSingleOrDefault
wyśle zapytanie do 2 rekordy (limit 2) podczasFirst
lubFirstOrDefault
wyśle zapytanie do 1 (limit 1).Zawsze używam
FirstOrDefault
. Jeśli naprawdę chcesz być wybredny w kwestii wydajności, powinieneś użyćFirstOrDefault
EF. Pod okładkamiSingleOrDefault
używa top (2) w zapytaniu, ponieważ musi sprawdzić, czy istnieje drugi wiersz, który pasuje do kryteriów, a jeśli tak, zgłasza wyjątek. ZasadniczoSingleOrDefault
mówisz, że chcesz zgłosić wyjątek, jeśli zapytanie zwróci więcej niż 1 rekord.źródło
FirstOrDefault
iSingleOrDefault
aby była znacząca? Powiedziałbym, że w większości przypadków jest to przedwczesna optymalizacja.Single()
lubSingleOrDefault()
zwracam coś, z czego powinien istnieć tylko jeden . Robię to, aby wykrywać błędy, wykonując źle napisane zapytania, które zwracają więcej niż powinny, i kończą się niepowodzeniem. Przynajmniej moim zdaniem pomoże to zachować spójność danych w systemie. Oczywiście to jest wolniejsze, ale myślę, że nie jest dużo wolniejsze i jestem gotów zapłacić taką cenę.To naprawdę bardzo proste:
Single
zwraca pojedynczy element i zgłasza wyjątek, jeśli nie ma żadnego elementu lub więcej niż jeden element.First
zwróci pierwszy przedmiot lub wyrzuci, gdy nie ma elementu.FirstOrDefault
zwróci pierwszą pozycję lub zwróci wartość domyślną (co ma miejscenull
w przypadku, gdy dany typ jest typem referencyjnym), gdy nie ma pozycji.To jest zachowanie, które powinien mieć interfejs API. Należy jednak pamiętać, że podstawowa implementacja może mieć inne zachowanie. Chociaż Entity Framework jest zgodny z tym, O / RM, taki jak LLBLGen, może również zwrócić
null
podczas wywoływania,First
co jest bardzo dziwne. To była bardzo dziwna (i uparta) decyzja projektanta IMO.źródło
Single
jasno wyraża, że oczekujesz, że wynik będzie miał tylko jeden element.Każda z czterech metod ma swoje miejsce; Chociaż tak naprawdę masz tylko dwie różne operacje.
Wersja xxxxOrDefault () po prostu dodaje „Nie chcę uważać pustego zestawu wyników za wyjątkową okoliczność”.
źródło
Z drugiej strony możesz podzielić te metody według podstawowej logiki, na przykład:
Szczegóły dotyczące wydajności, zwłaszcza w drugim przypadku, można znaleźć tutaj: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
Dodatkowo w pierwszej grupie można zdefiniować złożone zapytania, ale przy metodzie Find () można podać tylko klucz encji do wyszukiwania.
źródło
Single () i SingleOrDefault () są zwykle używane w przypadku unikalnych identyfikatorów, takich jak identyfikatory, podczas gdy First () lub FirstOrDefault () są zwykle używane w przypadku zapytania, które może mieć wiele wyników, ale potrzebujesz tylko „Top 1” .
Single () lub First () zgłosiłyby wyjątek, jeśli żaden wynik nie zostałby zwrócony, SingleOrDefault () i FirstOrDefault () przechwytują wyjątek i zwracają wartość null lub default (ResultDataType).
źródło