Zoeken…


Een LINQ-query vertalen naar een SQL-query

Met de IQueryable en IQueryable<T> interfaces kunnen ontwikkelaars een LINQ-query (een ' IQueryable<T> ' query) vertalen naar een specifieke gegevensbron, bijvoorbeeld een relationele database. Neem deze LINQ-vraag geschreven in C #:

var query = from book in books
            where book.Author == "Stephen King" 
            select book;

Als de variabele books van een type is dat IQueryable<Book> implementeert, wordt de bovenstaande query doorgegeven aan de provider (ingesteld op de eigenschap IQueryable.Provider ) in de vorm van een expressieboom, een gegevensstructuur die de structuur van de code weerspiegelt .

De provider kan de expressieboom tijdens runtime inspecteren om te bepalen:

  • dat er een predicaat is voor de eigenschap Author van de klasse Book ;
  • dat de gebruikte vergelijkingsmethode 'gelijk is' ( == );
  • dat de waarde die het moet evenaren "Stephen King" .

Met deze informatie kan de provider de C # -query tijdens runtime vertalen naar een SQL-query en die query doorgeven aan een relationele database om alleen die boeken op te halen die overeenkomen met het predicaat:

select *
from Books
where Author = 'Stephen King'

De provider wordt aangeroepen wanneer de query variabele wordt dan herhaald ( IQueryable implementeert IEnumerable ).

(De provider die in dit voorbeeld wordt gebruikt, heeft wat extra metagegevens nodig om te weten welke tabel moet worden opgevraagd en om te weten hoe eigenschappen van de klasse C # IQueryable gekoppeld aan kolommen van de tabel, maar dergelijke metagegevens vallen buiten het bereik van de IQueryable interface.)



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow