LINQ to Entities
LINQ to Entities poskytuje podporu jazykově integrovaných dotazů (LINQ), která vývojářům umožňuje psát dotazy na konceptuální model Entity Framework pomocí jazyka Visual Basic nebo Visual C#. Dotazy na Entity Framework jsou reprezentovány dotazy stromu příkazů, které se spouštějí v kontextu objektu. LINQ to Entities převádí dotazy integrované do jazyka (LINQ) na příkazové stromové dotazy, spouští dotazy na Entity Framework a vrací objekty, které lze používat v Entity Frameworku i LINQ. Následuje proces vytvoření a spuštění dotazu LINQ to Entities:
ObjectQuery<T> Vytvoření instance z ObjectContext.
Vytvořte dotaz LINQ to Entities v jazyce C# nebo Visual Basic pomocí ObjectQuery<T> instance.
Převeďte standardní operátory dotazů a výrazy LINQ na stromy příkazů.
Spusťte dotaz ve stromové reprezentaci příkazů proti zdroji dat. Všechny výjimky vyvolané zdrojem dat během provádění se předávají přímo klientovi.
Vrátí výsledky dotazu zpět klientovi.
Vytvoření instance ObjectQuery
Obecná ObjectQuery<T> třída představuje dotaz, který vrací kolekci nulových nebo více typed entity. Dotaz objektu je obvykle vytvořen z existujícího kontextu objektu, nikoli ručně sestavený a vždy patří do tohoto kontextu objektu. Tento kontext poskytuje informace o připojení a metadatech, které jsou potřeba k vytvoření a spuštění dotazu. Obecná ObjectQuery<T> třída implementuje IQueryable<T> obecné rozhraní, jehož metody tvůrce umožňují přírůstkové sestavení dotazů LINQ. Kompilátoru můžete také umožnit odvození typu entit pomocí klíčového slova jazyka C# var
(Dim
v jazyce Visual Basic s povoleným odvozováním místního typu).
Vytváření dotazů
ObjectQuery<T> Instance obecné třídy, která implementuje obecné IQueryable<T> rozhraní, slouží jako zdroj dat pro LINQ to Entities dotazy. 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 řadit, seskupit a tvarovat před vrácením. V LINQ je dotaz uložen v proměnné. Tato proměnná dotazu nevyžaduje žádnou akci a nevrací žádná data; ukládá pouze informace o dotazu. Po vytvoření dotazu je nutné tento dotaz spustit, aby se načetla všechna data.
Dotazy LINQ to Entities se dají skládat ve dvou různých syntaxích: syntaxi výrazů dotazů a syntaxi dotazů založenou na metodách. Syntaxe výrazů dotazů a syntaxe dotazů založených na metodách jsou nové v jazyce C# 3.0 a Visual Basic 9.0.
Další informace naleznete v tématu Dotazy v LINQ to Entities.
Převod dotazů
Chcete-li spustit dotaz LINQ to Entities na Entity Framework, musí být dotaz LINQ převeden na reprezentaci stromu příkazů, který lze provést v entity Framework.
Dotazy LINQ to Entities se skládají z standardních operátorů dotazu LINQ (například Select, Wherea ) a GroupByvýrazů (x > 10, Contact.LastName atd.). Operátory LINQ nejsou definovány třídou, ale spíše jsou metodami třídy. V LINQ můžou výrazy obsahovat cokoli povoleného pomocí typů v oboru System.Linq.Expressions názvů a podle rozšíření cokoli, co může být reprezentováno ve funkci lambda. Jedná se o nadmnožinu výrazů, které jsou povoleny rozhraním Entity Framework, které jsou v definici omezeny na operace povolené v databázi a podporovány ObjectQuery<T>.
V Entity Frameworku jsou operátory i výrazy reprezentovány jednou hierarchií typů, která se pak umístí do stromu příkazů. Ke spuštění dotazu používá strom příkazů Entity Framework. Pokud dotaz LINQ nelze vyjádřit jako strom příkazů, při převodu dotazu se vyvolá výjimka. Převod dotazů LINQ na Entity zahrnuje dva dílčí převody: převod standardních operátorů dotazu a převod výrazů.
Existuje několik standardních operátorů dotazu LINQ, které nemají platný překlad v LINQ to Entities. Při pokusu o použití těchto operátorů dojde k výjimce v době překladu dotazu. 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 dotazů v LINQ to Entities Queries.
Obecně platí, že výrazy v LINQ to Entities se vyhodnocují na serveru, takže chování výrazu by nemělo být očekávané podle sémantiky CLR. Další informace naleznete v tématu Výrazy v LINQ to Entities Dotazy.
Informace o tom, jak jsou volání metody CLR mapovány na kanonické funkce ve zdroji dat, naleznete v tématu CLR Metoda k Canonical Function Mapping.
Informace o volání kanonických, databázových a vlastních funkcí z dotazů LINQ to Entities naleznete v tématu Volání funkcí v LINQ to Entities Queries.
Provádění dotazů
Po vytvoření dotazu LINQ uživatelem se převede na reprezentaci, která je kompatibilní s Rozhraním Entity Framework (ve formě stromových příkazů), která se pak spustí proti zdroji dat. V době provádění dotazu se vyhodnocují všechny výrazy dotazů (nebo součásti dotazu) na klientovi nebo na serveru. To zahrnuje výrazy, které se používají při materializaci výsledků nebo projekcích entit. Další informace najdete v tématu Provádění dotazů. Informace o tom, jak zvýšit výkon kompilací dotazu jednou a jeho provedením několikrát s různými parametry, najdete v tématu Kompilované dotazy (LINQ to Entities).
Materializace
Materializace je proces vrácení výsledků dotazu zpět klientovi jako typy CLR. V LINQ to Entities se záznamy dat výsledků dotazu nikdy nevracejí; existuje vždy záložní typ CLR definovaný uživatelem nebo Entity Framework nebo vygenerovaný kompilátorem (anonymní typy). Všechna materializace objektů se provádí rozhraním Entity Framework. Všechny chyby, které vyplývají z nemožnosti mapování mezi Entity Framework a CLR, způsobí vyvolání výjimek během materializace objektů.
Výsledky dotazu se obvykle vrací jako jeden z následujících způsobů:
Kolekce nulových nebo více objektů entit typu nebo projekce složitých typů definovaných v konceptuálním modelu.
Typy CLR podporované rozhraním 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