Jak działają zapytania
Program Entity Framework Core używa zapytania zintegrowanego języka (LINQ) do wykonywania zapytań dotyczących danych z bazy danych. LINQ umożliwia używanie języka C# (lub wybranego języka .NET) do pisania silnie typiowanych zapytań na podstawie pochodnego kontekstu i klas jednostek.
Uwaga
Ten artykuł jest nieaktualny i niektóre z nich należy zaktualizować, aby uwzględnić zmiany wprowadzone w projekcie potoku zapytania. Jeśli masz jakiekolwiek wątpliwości co do jakiegokolwiek zachowania wymienionego tutaj, zadaj pytanie.
Żywotność zapytania
Poniższy opis zawiera ogólne omówienie procesu, przez który przechodzi każde zapytanie.
- Zapytanie LINQ jest przetwarzane przez program Entity Framework Core w celu utworzenia reprezentacji gotowej do przetworzenia przez dostawcę bazy danych
- Wynik jest buforowany tak, aby przetwarzanie nie było konieczne za każdym razem, gdy zapytanie jest wykonywane
- Wynik jest przekazywany do dostawcy bazy danych
- Dostawca bazy danych określa, które części zapytania można ocenić w bazie danych
- Te części zapytania są tłumaczone na język zapytań specyficzny dla bazy danych (na przykład SQL dla relacyjnej bazy danych)
- Zapytanie jest wysyłane do bazy danych i zwracany zestaw wyników (wyniki są wartościami z bazy danych, a nie wystąpieniami jednostek)
- Dla każdego elementu w zestawie wyników
- Jeśli zapytanie jest zapytaniem śledzącym, program EF sprawdza, czy dane reprezentują jednostkę już w monitorze zmian dla wystąpienia kontekstu
- Jeśli tak, zostanie zwrócona istniejąca jednostka
- Jeśli nie, zostanie utworzona nowa jednostka, zostanie skonfigurowane śledzenie zmian, a nowa jednostka zostanie zwrócona
- Jeśli zapytanie nie jest zapytaniem śledzenia, nowa jednostka jest zawsze tworzona i zwracana
- Jeśli zapytanie jest zapytaniem śledzącym, program EF sprawdza, czy dane reprezentują jednostkę już w monitorze zmian dla wystąpienia kontekstu
Gdy zapytania są wykonywane
Podczas wywoływania operatorów LINQ wystarczy utworzyć reprezentację zapytania w pamięci. Zapytanie jest wysyłane tylko do bazy danych, gdy wyniki są używane.
Najczęstsze operacje, które powodują wysłanie zapytania do bazy danych, to:
- Iterowanie wyników w
for
pętli - Używanie operatora, takiego jak
ToList
,ToArray
,Single
,Count
lub równoważne przeciążenia asynchroniczne
Ostrzeżenie
Zawsze weryfikuj dane wejściowe użytkownika: podczas gdy program EF Core chroni przed atakami polegającymi na wstrzyknięciu kodu SQL przy użyciu parametrów i ucieczki literałów w zapytaniach, nie weryfikuje danych wejściowych. Odpowiednią walidację zgodnie z wymaganiami aplikacji należy wykonać przed zastosowaniem wartości z niezauwierzonych źródeł w zapytaniach LINQ, przypisanych do właściwości jednostki lub przekazanych do innych interfejsów API platformy EF Core. Obejmuje to wszystkie dane wejściowe użytkownika używane do dynamicznego konstruowania zapytań. Nawet w przypadku korzystania z linQ, jeśli akceptujesz dane wejściowe użytkownika do kompilowania wyrażeń, musisz upewnić się, że można konstruować tylko zamierzone wyrażenia.