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.

  1. Zapytanie LINQ jest przetwarzane przez program Entity Framework Core w celu utworzenia reprezentacji gotowej do przetworzenia przez dostawcę bazy danych
    1. Wynik jest buforowany tak, aby przetwarzanie nie było konieczne za każdym razem, gdy zapytanie jest wykonywane
  2. Wynik jest przekazywany do dostawcy bazy danych
    1. Dostawca bazy danych określa, które części zapytania można ocenić w bazie danych
    2. Te części zapytania są tłumaczone na język zapytań specyficzny dla bazy danych (na przykład SQL dla relacyjnej bazy danych)
    3. Zapytanie jest wysyłane do bazy danych i zwracany zestaw wyników (wyniki są wartościami z bazy danych, a nie wystąpieniami jednostek)
  3. Dla każdego elementu w zestawie wyników
    1. 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
    2. Jeśli zapytanie nie jest zapytaniem śledzenia, nowa jednostka jest zawsze tworzona i zwracana

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, Countlub 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.