LINQ to Entities
LINQ to Entities poskytuje podporu pro Language-Integrated dotaz (LINQ), která vývojářům umožňuje psát dotazy pro Entity Framework koncepční model pomocí Visual Basic nebo Visual C#. Dotazy na Entity Framework jsou reprezentovány pomocí příkazového stromu příkazů, které jsou spouštěny proti kontextu objektu. LINQ to Entities převádí dotazy Language-Integrated dotazů (LINQ) na dotazy stromu příkazů, spouští dotazy proti Entity Framework a vrací objekty, které mohou být použity Entity Framework i LINQ. následující postup slouží k vytvoření a spuštění dotazu LINQ to Entities:
Vytvořte ObjectQuery<T> instanci z ObjectContext .
vytvoření dotazu LINQ to Entities v jazyce C# nebo Visual Basic pomocí ObjectQuery<T> instance.
Převede operátory dotazů LINQ Standard a výrazy na stromy příkazů.
Spusťte dotaz, v reprezentace stromu příkazů, oproti zdroji dat. Jakékoli výjimky vyvolané ve zdroji dat během provádění jsou předány přímo do klienta.
Vrátí výsledky dotazu zpátky klientovi.
Sestavování instance ObjectQuery
ObjectQuery<T>Obecná třída reprezentuje dotaz, který vrací kolekci nula nebo více typových entit. Dotaz na objekt je obvykle vytvořen z kontextu existujícího objektu místo ručního sestavení a vždy patří do kontextu daného objektu. Tento kontext poskytuje informace o připojení a metadatech, které jsou nutné k vytvoření a spuštění dotazu. ObjectQuery<T>Obecná třída implementuje IQueryable<T> Obecné rozhraní, jejichž metody Tvůrce umožňují přírůstkové sestavení dotazů LINQ. můžete také nechat kompilátor odvodit typ entit pomocí var klíčového slova jazyka C# ( Dim v Visual Basic s povoleným odvozením místního typu).
Vytváření dotazů
instance ObjectQuery<T> obecné třídy, které implementují obecné IQueryable<T> rozhraní, slouží jako zdroj dat pro LINQ to Entities dotazů. V dotazu zadáte přesně informace, které chcete načíst ze zdroje dat. Dotaz může také určit, jak se mají tyto informace seřadit, seskupit a tvarovat před tím, než se vrátí. V LINQ je dotaz uložen v proměnné. Tato proměnná dotazu neprovádí žádnou akci a nevrátí žádná data. ukládá pouze informace o dotazu. Po vytvoření dotazu musíte spustit dotaz, aby se načetla nějaká data.
dotazy LINQ to Entities můžou být složené ve dvou různých syntaxech: syntax výrazů dotazů a syntaxe dotazů založených na metodách. syntaxe výrazu dotazu a syntaxe dotazu založeného na metodách jsou v jazyce C# 3,0 a Visual Basic 9,0 novinkou.
Další informace najdete v tématu dotazy v LINQ to Entities.
Převod dotazů
chcete-li spustit dotaz LINQ to Entities proti Entity Framework, je nutné dotaz LINQ převést na reprezentace stromu příkazů, která může být provedena proti Entity Framework.
LINQ to Entities dotazy se skládají z standardních operátorů dotazů LINQ (například Select , Where a GroupBy ) a výrazů (x > 10, Contact. LastName atd.). Operátory LINQ nejsou definovány třídou, ale spíše jsou metody třídy. Výrazy v jazyce LINQ mohou obsahovat cokoli, co povoluje typy v rámci System.Linq.Expressions oboru názvů a podle přípony, cokoli, co může být reprezentována ve funkci lambda. Toto je nadmnožina výrazů, které jsou povoleny Entity Framework, které jsou podle definice omezené na operace povolené v databázi a které podporuje ObjectQuery<T> .
V Entity Framework jsou oba operátory a výrazy zastoupeny jedinou hierarchií typů, která je poté umístěna do stromu příkazů. Strom příkazů je používán Entity Framework k provedení dotazu. Pokud dotaz LINQ nelze vyjádřit jako strom příkazů, při převodu dotazu bude vyvolána výjimka. převod LINQ to Entities dotazů zahrnuje dva dílčí převody: převod standardních operátorů dotazu a převod výrazů.
Existuje mnoho standardních operátorů dotazů LINQ, které nemají platný překlad v LINQ to Entities. Pokusy o použití těchto operátorů způsobí výjimku v době překladu dotazů. seznam podporovaných operátorů LINQ to Entities najdete v tématu podporované a nepodporované metody LINQ (LINQ to Entities).
další informace o použití standardních operátorů dotazu v LINQ to Entities naleznete v tématu standardní operátory dotazu v LINQ to Entitiesch dotazech.
obecně platí, že výrazy ve LINQ to Entities jsou vyhodnocovány na serveru, takže chování výrazu by nemělo následovat za sémantikou CLR. další informace najdete v tématu výrazy v LINQ to Entitiesch dotazech.
Informace o tom, jak jsou volání metod CLR mapována na kanonické funkce ve zdroji dat, naleznete v tématu Metoda CLR na kanonické mapování funkcí.
informace o tom, jak volat kanonické, databázové a vlastní funkce v rámci LINQ to Entitiesch dotazů, najdete v tématu volání funkcí v dotazech LINQ to Entities.
Provádění dotazů
Poté, co uživatel vytvoří dotaz LINQ, je převedena na reprezentace, která je kompatibilní s Entity Framework (ve formě stromů příkazů), který je následně proveden proti zdroji dat. V době spuštění dotazu jsou všechny výrazy dotazu (nebo komponenty dotazu) vyhodnocovány na klientovi nebo na serveru. To zahrnuje výrazy, které se používají v materializech výsledků nebo projektech entit. Další informace najdete v tématu provádění dotazů. Informace o tom, jak zvýšit výkon kompilováním dotazu jednou a jeho spuštěním několikrát s různými parametry, naleznete v tématu kompilované dotazy (LINQ to Entities).
Materializaci
Materializace je proces vrácení výsledků dotazu zpět do klienta jako typy CLR. v LINQ to Entities se záznamy dat výsledků dotazu nikdy nevrátí; vždy je k dispozici záložní typ CLR definovaný uživatelem nebo Entity Framework nebo generovaný kompilátorem (anonymní typy). Všechny materializování objektů provádí Entity Framework. Všechny chyby, které jsou výsledkem neschopnosti mapování mezi Entity Framework a CLR, způsobí, že budou výjimky vyvolány během materializace objektu.
Výsledky dotazu jsou obvykle vraceny jako jedna z následujících:
Kolekce nula nebo více typových objektů entit nebo projekce komplexních typů definovaných v koncepčním modelu.
Typy CLR, které jsou podporovány Entity Framework.
Vložené kolekce.
Anonymní typy.
Další informace najdete v tématu výsledky dotazu.
V tomto oddílu
Dotazy v technologii LINQ to Entities
Výrazy v dotazech LINQ to Entities
Volání funkcí v dotazech LINQ to Entities
Kompilované dotazy (LINQ to Entities)
Standardní operátory dotazů LINQ to Entities
Metoda CLR pro mapování kanonických funkcí
Podporované a nepodporované metody LINQ (LINQ to Entities)
Známé problémy a aspekty u LINQ to Entities