Jak fungují dotazy

Entity Framework Core používá k dotazování dat z databáze jazykový integrovaný dotaz (LINQ). LINQ umožňuje psát dotazy silného typu na základě odvozeného kontextu a tříd entit pomocí jazyka C# (nebo vámi zvoleného jazyka .NET).

Poznámka

Tento článek je zastaralý a některé jeho části je potřeba aktualizovat tak, aby odpovídaly změnám, ke které došlo v návrhu kanálu dotazů. Pokud máte nějaké pochybnosti o chování zde uvedené, zeptejte se prosím.

Životnost dotazu

Následující popis představuje základní přehled procesu, který každý dotaz prochází.

  1. Dotaz LINQ zpracovává Entity Framework Core a vytvoří reprezentaci, která je připravená ke zpracování poskytovatelem databáze.
    1. Výsledek se uloží do mezipaměti, aby se toto zpracování nemuselo provádět při každém spuštění dotazu.
  2. Výsledek se předá poskytovateli databáze.
    1. Zprostředkovatel databáze identifikuje, které části dotazu je možné vyhodnotit v databázi.
    2. Tyto části dotazu se překládají do dotazovacího jazyka specifického pro databázi (například SQL pro relační databázi).
    3. Dotaz se odešle do databáze a vrácená sada výsledků (výsledky jsou hodnoty z databáze, ne instance entit).
  3. Pro každou položku v sadě výsledků
    1. Pokud je dotaz sledovacím dotazem, ef zkontroluje, jestli data představují entitu, která už je ve sledování změn pro instanci kontextu.
      • Pokud ano, vrátí se existující entita.
      • Pokud ne, vytvoří se nová entita, nastaví se sledování změn a vrátí se nová entita.
    2. Pokud se jedná o dotaz bez sledování, vytvoří se nová entita a vrátí se vždy.

Při spuštění dotazů

Při volání operátorů LINQ jednoduše vytváříte reprezentaci dotazu v paměti. Dotaz se odešle do databáze pouze v případech, kdy se spotřebují výsledky.

Nejběžnější operace, které vedou k odeslání dotazu do databáze, jsou:

  • Iterace výsledků ve smyčce for
  • Použití operátoru, jako ToListje , ToArray, CountSinglenebo ekvivalentní asynchronní přetížení

Upozorňující

Vždy ověřte vstup uživatele: Zatímco EF Core chrání před útoky prostřednictvím injektáže SQL pomocí parametrů a úniku literálů v dotazech, neověřuje vstupy. Před použitím hodnot z nedůvěryhodných zdrojů v dotazech LINQ, přiřazením k vlastnostem entity nebo předáním jiným rozhraním EF Core API by se mělo provést odpovídající ověření podle požadavků aplikace. To zahrnuje jakýkoli uživatelský vstup používaný k dynamickému vytváření dotazů. I když používáte LINQ, pokud přijímáte uživatelský vstup do sestavení výrazů, musíte zajistit, aby bylo možné vytvořit pouze zamýšlené výrazy.