C# Language
IQueryable-gränssnitt
Sök…
Översätta en LINQ-fråga till en SQL-fråga
IQueryable
och IQueryable<T>
gör det möjligt för utvecklare att översätta en LINQ-fråga (en "språkintegrerad" fråga) till en specifik datakälla, till exempel en relationsdatabas. Ta denna LINQ-fråga skriven i C #:
var query = from book in books
where book.Author == "Stephen King"
select book;
Om variabla books
är av en typ som implementerar IQueryable<Book>
kommer frågan ovan att skickas till leverantören (inställd på egenskapen IQueryable.Provider
) i form av ett uttrycksträd, en datastruktur som återspeglar strukturen för koden .
Leverantören kan inspektera uttrycksträdet under körning för att bestämma:
- att det finns ett predikat för
Author
egendom förBook
; - att den använda jämförelsemetoden är 'lika' (
==
); - att värdet det ska vara lika är
"Stephen King"
.
Med den här informationen kan leverantören översätta C # -frågan till en SQL-fråga under körning och skicka den frågan till en relationsdatabas för att bara hämta de böcker som matchar predikatet:
select *
from Books
where Author = 'Stephen King'
Leverantören kommer att ringas när query
är itererad ( IQueryable
implementerar IEnumerable
).
(Den leverantör som används i det här exemplet kräver några extra metadata för att veta vilken tabell att fråga och för att veta hur man matchar egenskaperna i C # -klassen till kolumnerna i tabellen, men sådana metadata ligger utanför räckvidden för IQueryable
gränssnittet.)