sobota, 15 września 2012

Czym się różni Single od First w LINQ

W LINQ mamy dwie metody First() oraz Single().
Obie metody zwracają po jednym rekordzie. Jaka jest więc między nimi różnica?

Zobaczmy na kawałek kodu i jego reprezentację w bazie MS SQL (zapytania wyciągnięte z Profilera):


Code:
        static void Main(string[] args)
        {
            var test1Context = new test1Context();
            var single = test1Context.Pojazds.Single(x => x.Id == 100);
            var first = test1Context.Pojazds.First(x => x.Id == 100);
        }

SELECT TOP (2) [Extent1].[Id] AS [Id], [Extent1].[Nazwa] AS [Nazwa]FROM [dbo].[Pojazd] AS [Extent1]WHERE 100 = [Extent1].[Id]
SELECT TOP (1) [Extent1].[Id] AS [Id], [Extent1].[Nazwa] AS [Nazwa]FROM [dbo].[Pojazd] AS [Extent1]WHERE 100 = [Extent1].[Id]


Jak widać Single wybiera 2 rekordy a First tylko jeden. Dlaczego?
W przypadku Single pobierane są dwa pierwsze rekordy, które zwróci zapytanie. Następnie sprawdzane jest czy faktycznie jest jeden rekord, a w przypadku gdy są dwa rzucany jest wyjątek. W przypadku metody First wyjątek nie zostanie rzucony, jeżeli zapytanie zwróci więcej niż jeden wynik.

Ma to swoje zalety, w przypadku gdy musimy otrzymać tylko jeden wynik a z jakichś względów otrzymujemy więcej wyników. Korzystając z metody Single możemy szybciej zdiagnozować problemy, które mogą się objawić w aplikacji.

Brak komentarzy:

Prześlij komentarz