Share via


LINQ naar entiteiten

LINQ to Entities biedt LINQ-ondersteuning (Language-Integrated Query) waarmee ontwikkelaars query's kunnen schrijven op basis van het conceptuele model van Entity Framework met behulp van Visual Basic of Visual C#. Query's voor Entity Framework worden vertegenwoordigd door opdrachtstructuurquery's die worden uitgevoerd op basis van de objectcontext. LINQ naar entiteiten converteert LANGUAGE-Integrated Query's (LINQ)-query's naar opdrachtstructuurquery's, voert de query's uit op het Entity Framework en retourneert objecten die kunnen worden gebruikt door zowel entity framework als LINQ. Hier volgt het proces voor het maken en uitvoeren van een LINQ naar entiteitenquery:

  1. Maak een ObjectQuery<T> exemplaar van ObjectContext.

  2. Stel een LINQ op entiteitenquery in C# of Visual Basic op met behulp van het ObjectQuery<T> exemplaar.

  3. LinQ-standaardqueryoperators en -expressies converteren naar opdrachtstructuren.

  4. Voer de query uit in de opdrachtstructuurweergave op basis van de gegevensbron. Eventuele uitzonderingen die tijdens de uitvoering op de gegevensbron worden gegenereerd, worden rechtstreeks doorgegeven aan de client.

  5. Retourneer queryresultaten terug naar de client.

Een ObjectQuery-exemplaar maken

De ObjectQuery<T> algemene klasse vertegenwoordigt een query die een verzameling van nul of meer getypte entiteiten retourneert. Een objectquery wordt doorgaans samengesteld op basis van een bestaande objectcontext, in plaats van handmatig te worden samengesteld en behoort altijd tot die objectcontext. Deze context bevat de verbindings- en metagegevensgegevens die nodig zijn om de query op te stellen en uit te voeren. De ObjectQuery<T> algemene klasse implementeert de IQueryable<T> algemene interface, waarvan de opbouwmethoden LINQ-query's incrementeel kunnen maken. U kunt de compiler ook het type entiteiten laten afleiden met behulp van het C# var -trefwoord (Dim in Visual Basic, waarbij deductie van het lokale type is ingeschakeld).

De query's opstellen

Exemplaren van de ObjectQuery<T> algemene klasse, die de algemene IQueryable<T> interface implementeert, fungeren als de gegevensbron voor LINQ naar entiteiten-query's. In een query geeft u precies de informatie op die u uit de gegevensbron wilt ophalen. Een query kan ook opgeven hoe deze informatie moet worden gesorteerd, gegroepeerd en vormgegeven voordat deze wordt geretourneerd. In LINQ wordt een query opgeslagen in een variabele. Deze queryvariabele voert geen actie uit en retourneert geen gegevens; alleen de querygegevens worden opgeslagen. Nadat u een query hebt gemaakt, moet u die query uitvoeren om gegevens op te halen.

LINQ-naar-entiteitenquery's kunnen worden samengesteld in twee verschillende syntaxis: syntaxis van queryexpressie en op methoden gebaseerde querysyntaxis. Syntaxis van query-expressies en op methoden gebaseerde querysyntaxis zijn nieuw in C# 3.0 en Visual Basic 9.0.

Zie Query's in LINQ naar entiteiten voor meer informatie.

Queryconversie

Als u een LINQ wilt uitvoeren naar entiteitenquery op basis van entity framework, moet de LINQ-query worden geconverteerd naar een opdrachtstructuurweergave die kan worden uitgevoerd op basis van entity framework.

LINQ naar entiteiten-query's bestaan uit LINQ-standaardqueryoperators (zoals Select, Whereen ) en GroupByexpressies (x > 10, Contact.LastName, enzovoort). LINQ-operators worden niet gedefinieerd door een klasse, maar zijn eerder methoden voor een klasse. In LINQ kunnen expressies alles bevatten dat is toegestaan door typen binnen de System.Linq.Expressions naamruimte en, met extensie, alles wat in een lambda-functie kan worden weergegeven. Dit is een superset van de expressies die zijn toegestaan door het Entity Framework, die per definitie zijn beperkt tot bewerkingen die zijn toegestaan op de database en die worden ondersteund door ObjectQuery<T>.

In Entity Framework worden zowel operators als expressies vertegenwoordigd door één typehiërarchie, die vervolgens in een opdrachtstructuur worden geplaatst. De opdrachtstructuur wordt door entity framework gebruikt om de query uit te voeren. Als de LINQ-query niet kan worden uitgedrukt als een opdrachtstructuur, wordt er een uitzondering gegenereerd wanneer de query wordt geconverteerd. De conversie van LINQ naar entiteitenquery's omvat twee subconversies: de conversie van de standaardqueryoperators en de conversie van de expressies.

Er zijn een aantal LINQ-standaardqueryoperators die geen geldige vertaling hebben in LINQ naar entiteiten. Pogingen om deze operators te gebruiken, resulteren in een uitzondering tijdens het vertalen van query's. Zie Ondersteunde en niet-ondersteunde LINQ-methoden (LINQ naar entiteiten) voor een lijst met ondersteunde LINQ to Entities-operators.

Zie Standard-queryoperators in LINQ naar entiteiten voor meer informatie over het gebruik van de standaardqueryoperators in LINQ naar entiteitenquery's.

In het algemeen worden expressies in LINQ naar entiteiten geëvalueerd op de server, dus het gedrag van de expressie mag niet worden verwacht om clr-semantiek te volgen. Zie Expressies in LINQ naar entiteitenquery's voor meer informatie.

Zie CLR Method to Canonical Function Mapping voor informatie over hoe CLR-methode-aanroepen worden toegewezen aan canonieke functies in de gegevensbron.

Zie Functies aanroepen in LINQ naar entiteitenquery's voor informatie over het aanroepen van canonieke, database- en aangepaste functies vanuit LINQ naar entiteitenquery's.

Queryuitvoering

Nadat de LINQ-query is gemaakt door de gebruiker, wordt deze geconverteerd naar een weergave die compatibel is met entity framework (in de vorm van opdrachtstructuren), die vervolgens wordt uitgevoerd op basis van de gegevensbron. Tijdens de uitvoering van query's worden alle query-expressies (of onderdelen van de query) geëvalueerd op de client of op de server. Dit omvat expressies die worden gebruikt in resultaat materialisatie of entiteitsprojecties. Zie Queryuitvoering voor meer informatie. Zie Compiled Query's (LINQ to Entities) voor informatie over het verbeteren van de prestaties door een query eenmaal te compileren en deze vervolgens meerdere keren uit te voeren met verschillende parameters.

Materialisatie

Materialisatie is het proces van het retourneren van queryresultaten naar de client als CLR-typen. In LINQ naar entiteiten worden queryresultatengegevensrecords nooit geretourneerd; er altijd een clr-backingtype is, gedefinieerd door de gebruiker of het Entity Framework, of gegenereerd door de compiler (anonieme typen). Alle object materialisatie wordt uitgevoerd door het Entity Framework. Fouten die het gevolg zijn van een onvermogen om toe te wijzen tussen het Entity Framework en de CLR, leiden ertoe dat er uitzonderingen worden gegenereerd tijdens het materialiseren van objecten.

Queryresultaten worden meestal als een van de volgende geretourneerd:

  • Een verzameling van nul of meer getypte entiteitsobjecten of een projectie van complexe typen die in het conceptuele model zijn gedefinieerd.

  • CLR-typen die worden ondersteund door Entity Framework.

  • Inlineverzamelingen.

  • Anonieme typen.

Zie Queryresultaten voor meer informatie.

In dit gedeelte

Query's in LINQ naar entiteiten

Expressies in LINQ naar entiteitenquery's

Functies in LINQ aanroepen naar entiteitenquery's

Gecompileerde query's (LINQ naar entiteiten)

Queryuitvoering

Queryresultaten

Standaardqueryoperators in LINQ naar entiteitenquery's

CLR-methode voor canonieke functietoewijzing

Ondersteunde en niet-ondersteunde LINQ-methoden (LINQ naar entiteiten)

Bekende problemen en overwegingen in LINQ naar entiteiten

Zie ook