Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Language-Integrated Query (LINQ) is de naam voor een set technologieën op basis van de integratie van querymogelijkheden rechtstreeks in de C#-taal. Query's op gegevens worden traditioneel uitgedrukt als eenvoudige tekenreeksen zonder typecontrole tijdens het compileren of intelliSense-ondersteuning. Daarnaast moet u een andere querytaal leren voor elk type gegevensbron: SQL-databases, XML-documenten, verschillende webservices, enzovoort. Met LINQ is een query een eersteklas taalconstructie, net als klassen, methoden en gebeurtenissen.
Wanneer u query's schrijft, is het meest zichtbare onderdeel van LINQ de 'taalgeïntegreerde' query-expressie. Query-expressies worden geschreven in een declaratieve querysyntaxis. Door querysyntaxis te gebruiken, voert u filter-, volgorde- en groeperingsbewerkingen uit op gegevensbronnen met een minimum aan code. U gebruikt dezelfde queryexpressiepatronen om gegevens uit elk type gegevensbron op te vragen en te transformeren.
In het volgende voorbeeld ziet u een volledige querybewerking. De volledige bewerking omvat het maken van een gegevensbron, het definiëren van de query-expressie en het uitvoeren van de query in een foreach
instructie.
// Specify the data source.
int[] scores = [97, 92, 81, 60];
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (var i in scoreQuery)
{
Console.Write(i + " ");
}
// Output: 97 92 81
Mogelijk moet u een using
richtlijn toevoegen, using System.Linq;
zodat het voorgaande voorbeeld kan worden gecompileerd. De meest recente versies van .NET maken gebruik van impliciete usings om deze richtlijn toe te voegen als een globaal gebruik. Voor oudere versies moet u deze toevoegen aan uw bron.
Overzicht van query-expressies
- Query-expressies voeren query's uit en transformeren gegevens uit een gegevensbron met LINQ-functionaliteit. Een enkele query kan bijvoorbeeld gegevens ophalen uit een SQL-database en een XML-stroom als uitvoer produceren.
- Query-expressies maken gebruik van veel bekende C#-taalconstructies, waardoor ze gemakkelijk te lezen zijn.
- De variabelen in een query-expressie zijn allemaal sterk getypt.
- Een query wordt pas uitgevoerd nadat u de queryvariabele hebt herhaald, bijvoorbeeld in een
foreach
instructie. - Tijdens het compileren worden query-expressies geconverteerd naar aanroepen van de standaardqueryoperatormethode volgens de regels die zijn gedefinieerd in de C#-specificatie. Elke query die kan worden uitgedrukt met behulp van querysyntaxis, kan ook worden uitgedrukt met behulp van de syntaxis van de methode. In sommige gevallen is de querysyntaxis beter leesbaar en beknopter. In andere is de syntaxis van de methode beter leesbaar. Er is geen semantisch of prestatieverschil tussen de twee verschillende formulieren. Zie voor meer informatie de C#-taalspecificatie en het overzicht van Standard-queryoperators.
- Sommige querybewerkingen, zoals Count of Max, hebben geen equivalente query-expressieclausule en moeten daarom worden weergegeven als een methode-aanroep. Methodesyntaxis kan op verschillende manieren worden gecombineerd met querysyntaxis.
- Query-expressies kunnen worden gecompileerd naar expressiebomen of gedelegeerden, afhankelijk van het type waarop de query wordt toegepast. IEnumerable<T> query's worden gecompileerd naar gemachtigden. IQueryable en IQueryable<T> queries worden gecompileerd tot expressiebomen. Zie Expressiestructuren voor meer informatie.
LINQ-query's inschakelen voor uw gegevensbron
In-memorygegevens
Er zijn twee manieren waarop u LINQ-query's kunt uitvoeren op gegevens in het geheugen. Als de gegevens van een type zijn dat wordt geïmplementeerd IEnumerable<T>, voert u een query uit op de gegevens met behulp van LINQ naar objecten. Als het niet zinvol is om opsomming in te schakelen door de IEnumerable<T> interface te implementeren, definieert u de standaard-operatormethoden voor LINQ-query's, in dat type of als extensiemethoden voor dat type. Aangepaste implementaties van de standaardqueryoperators moeten de uitgestelde uitvoering gebruiken om de resultaten te retourneren.
Externe gegevens
De beste optie voor het inschakelen van LINQ-query's van een externe gegevensbron is het implementeren van de IQueryable<T> interface.
IQueryable LINQ-providers
LINQ-providers die implementeren IQueryable<T> , kunnen sterk verschillen in hun complexiteit.
Een minder complexe IQueryable
provider heeft mogelijk toegang tot één methode vanuit een webservice. Dit type provider is zeer specifiek omdat er specifieke informatie wordt verwacht in de query's die worden verwerkt. Het heeft een gesloten typesysteem, mogelijk met één resultaattype. De meeste uitvoering van de query vindt lokaal plaats, bijvoorbeeld met behulp van de Enumerable implementaties van de standaardqueryoperators. Een minder complexe provider kan slechts één methode-aanroepexpressie onderzoeken in de expressiestructuur die de query vertegenwoordigt en de resterende logica van de query ergens anders laten verwerken.
Een IQueryable
provider van gemiddelde complexiteit kan zich richten op een gegevensbron met een gedeeltelijk expressieve querytaal. Als deze is gericht op een webservice, heeft deze mogelijk toegang tot meer dan één methode van de webservice en selecteert u welke methode moet worden aangeroepen op basis van de informatie die de query zoekt. Een provider van gemiddelde complexiteit zou een uitgebreider typesysteem hebben dan een eenvoudige provider, maar het zou nog steeds een vast type systeem zijn. De provider kan bijvoorbeeld typen beschikbaar maken met een-op-veel-relaties die kunnen worden doorkruist, maar biedt geen mapping- of koppeltechnologie voor door de gebruiker gedefinieerde typen.
Een complexe IQueryable
provider, zoals de Entity Framework Core-provider , kan volledige LINQ-query's vertalen naar een expressieve querytaal, zoals SQL. Een complexe provider is algemener omdat deze een grotere verscheidenheid aan vragen in de query kan verwerken. Het heeft ook een open typesysteem en moet daarom een uitgebreide infrastructuur bevatten om gebruikergedefinieerde typen toe te wijzen. Voor het ontwikkelen van een complexe provider is een aanzienlijke hoeveelheid inspanning vereist.