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. U schrijft query-expressies 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 onderzoeken en transformeren gegevens uit een gegevensbron met LINQ-functionaliteit. Eén 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
foreachinstructie. - Tijdens het compileren converteert de compiler query-expressies naar standaardqueryoperatormethode-aanroepen volgens de regels die zijn gedefinieerd in de C#-specificatie. U kunt elke query die de querysyntaxis gebruikt, uitdrukken in methodesyntaxis. 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 queryexpressiecomponent en moeten worden uitgedrukt als een methode-aanroep. U kunt methodesyntaxis op verschillende manieren combineren met querysyntaxis.
- Query-expressies kunnen worden gecompileerd naar expressiebomen of gedelegeerden, afhankelijk van het type waarop de query wordt toegepast. De compiler compileert IEnumerable<T> queries naar delegaties. De compiler compileert IQueryable en IQueryable<T> query's naar expressiebomen. Zie Expressiestructuren voor meer informatie.
LINQ-query's inschakelen voor uw gegevensbron
In-memorygegevens
U kunt LINQ-query's voor in-memory gegevens op twee manieren inschakelen. Als de gegevens van een type zijn dat IEnumerable<T> implementeert, voer dan een query uit op de gegevens met behulp van LINQ to Objects. Als het niet zinvol is om opsomming in te schakelen door de IEnumerable<T> interface te implementeren, definieert u de standaardqueryoperatormethoden linQ in dat type of als extensieleden 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 specifiek voor de gegevensbron, 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 heeft een uitgebreider typesysteem dan een eenvoudige provider, maar het is nog steeds een vast type systeem. De provider kan bijvoorbeeld typen beschikbaar stellen met een-op-veel-relaties die kunnen worden doorlopen, maar biedt geen mappingtechnologie 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.