Szukaj…


Tłumaczenie zapytania LINQ na zapytanie SQL

Interfejsy IQueryable i IQueryable<T> umożliwiają programistom przetłumaczenie zapytania LINQ (zapytania „zintegrowanego z językiem”) na określone źródło danych, na przykład relacyjną bazę danych. Weź to zapytanie LINQ napisane w C #:

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

Jeśli books zmiennych są typu, który implementuje IQueryable<Book> powyższe zapytanie jest przekazywane do dostawcy (ustawionego na właściwość IQueryable.Provider ) w postaci drzewa wyrażeń, struktury danych odzwierciedlającej strukturę kodu .

Dostawca może sprawdzić drzewo wyrażeń w czasie wykonywania, aby ustalić:

  • że istnieje predykat dla właściwości Author klasy Book ;
  • zastosowana metoda porównania to „równa się” ( == );
  • że wartość powinna być równa "Stephen King" .

Dzięki tym informacjom dostawca może przetłumaczyć zapytanie C # na zapytanie SQL w czasie wykonywania i przekazać to zapytanie do relacyjnej bazy danych, aby pobrać tylko te książki, które pasują do predykatu:

select *
from Books
where Author = 'Stephen King'

Dostawca jest wywoływany, gdy zmienna query jest iterowana ( IQueryable implementuje IEnumerable ).

(Dostawca użyty w tym przykładzie wymagałby dodatkowych metadanych, aby wiedzieć, do której tabeli należy wysłać zapytanie i wiedzieć, jak dopasować właściwości klasy C # do kolumn tabeli, ale takie metadane są poza zakresem interfejsu IQueryable .)



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow