Udostępnij za pośrednictwem


LINQ to Entities

LinQ to Entities zapewnia obsługę zapytań zintegrowanych z językiem (LINQ), która umożliwia deweloperom pisanie zapytań względem modelu koncepcyjnego platformy Entity Framework przy użyciu języka Visual Basic lub Visual C#. Zapytania względem programu Entity Framework są reprezentowane przez zapytania drzewa poleceń, które są wykonywane względem kontekstu obiektu. LINQ to Entities konwertuje zapytania zintegrowane z językiem (LINQ) na zapytania drzewa poleceń, wykonuje zapytania względem platformy Entity Framework i zwraca obiekty, które mogą być używane zarówno przez platformę Entity Framework, jak i LINQ. Poniżej przedstawiono proces tworzenia i wykonywania zapytania LINQ to Entities:

  1. Skonstruuj ObjectQuery<T> wystąpienie z klasy ObjectContext.

  2. Utwórz zapytanie LINQ to Entities w języku C# lub Visual Basic przy użyciu ObjectQuery<T> wystąpienia.

  3. Konwertowanie standardowych operatorów zapytań i wyrażeń LINQ na drzewa poleceń.

  4. Wykonaj zapytanie w reprezentacji drzewa poleceń względem źródła danych. Wszelkie wyjątki zgłoszone w źródle danych podczas wykonywania są przekazywane bezpośrednio do klienta.

  5. Zwracanie wyników zapytania z powrotem do klienta.

Konstruowanie wystąpienia obiektu ObjectQuery

Klasa ObjectQuery<T> ogólna reprezentuje zapytanie, które zwraca kolekcję zero lub więcej typionych jednostek. Zapytanie o obiekt jest zwykle konstruowane z istniejącego kontekstu obiektu, a nie ręcznie skonstruowane i zawsze należy do tego kontekstu obiektu. Ten kontekst zawiera informacje o połączeniu i metadanych wymagane do tworzenia i wykonywania zapytania. Klasa ObjectQuery<T> ogólna implementuje IQueryable<T> interfejs ogólny, którego metody konstruktora umożliwiają tworzenie zapytań LINQ przyrostowo. Kompilator może również wywnioskować typ jednostek przy użyciu słowa kluczowego C# var (Dim w Visual Basic z włączonym wnioskowaniem typu lokalnego).

Tworzenie zapytań

ObjectQuery<T> Wystąpienia klasy ogólnej, która implementuje interfejs ogólnyIQueryable<T>, służą jako źródło danych dla zapytań LINQ to Entities. W zapytaniu należy określić dokładnie informacje, które chcesz pobrać ze źródła danych. Zapytanie może również określać sposób sortowania, grupowania i kształtowania informacji przed ich zwróceniem. W linQ zapytanie jest przechowywane w zmiennej. Ta zmienna kwerendy nie wykonuje żadnej akcji i nie zwraca żadnych danych; przechowuje tylko informacje o kwerendzie. Po utworzeniu zapytania należy wykonać to zapytanie, aby pobrać dowolne dane.

Zapytania LINQ to Entities mogą składać się z dwóch różnych składni: składni wyrażenia zapytania i składni zapytań opartej na metodzie. Składnia wyrażeń zapytań i składnia zapytań oparta na metodach są nowe w języku C# 3.0 i Visual Basic 9.0.

Aby uzyskać więcej informacji, zobacz Zapytania w linQ to Entities.

Konwersja zapytań

Aby wykonać zapytanie LINQ to Entities względem platformy Entity Framework, zapytanie LINQ musi zostać przekonwertowane na reprezentację drzewa poleceń, którą można wykonać na platformie Entity Framework.

Zapytania LINQ to Entities składają się z standardowych operatorów zapytań LINQ (takich jak Select, Wherei ) i GroupBywyrażeń (x > 10, Contact.LastName itd.). Operatory LINQ nie są definiowane przez klasę, ale raczej są metodami w klasie. W linQ wyrażenia mogą zawierać dowolne dozwolone typy w System.Linq.Expressions przestrzeni nazw i, według rozszerzenia, wszystkie elementy, które mogą być reprezentowane w funkcji lambda. Jest to nadzbiór wyrażeń, które są dozwolone przez program Entity Framework, które są z definicji ograniczone do operacji dozwolonych w bazie danych i obsługiwane przez ObjectQuery<T>program .

W programie Entity Framework operatory i wyrażenia są reprezentowane przez hierarchię pojedynczego typu, która następnie jest umieszczana w drzewie poleceń. Drzewo poleceń jest używane przez program Entity Framework do wykonywania zapytania. Jeśli nie można wyrazić kwerendy LINQ jako drzewa poleceń, podczas konwertowania zapytania zostanie zgłoszony wyjątek. Konwersja zapytań LINQ to Entities obejmuje dwie konwersje podrzędne: konwersję standardowych operatorów zapytań i konwersję wyrażeń.

Istnieje wiele standardowych operatorów zapytań LINQ, które nie mają prawidłowego tłumaczenia w jednostki LINQ to Entities. Próby użycia tych operatorów spowodują wyjątek w czasie tłumaczenia zapytania. Aby uzyskać listę obsługiwanych operatorów LINQ to Entities, zobacz Obsługiwane i nieobsługiwane metody LINQ (LINQ to Entities).

Aby uzyskać więcej informacji na temat używania standardowych operatorów zapytań w jednostki LINQ to Entities, zobacz Standardowe operatory zapytań w zapytaniach LINQ to Entities.

Ogólnie rzecz biorąc, wyrażenia w linQ to Entities są oceniane na serwerze, więc zachowanie wyrażenia nie powinno być zgodne z semantykami CLR. Aby uzyskać więcej informacji, zobacz Wyrażenia w zapytaniach LINQ to Entities.

Aby uzyskać informacje na temat sposobu mapowania wywołań metody CLR na funkcje kanoniczne w źródle danych, zobacz CLR Method to Canonical Function Mapping (Metoda CLR do mapowania funkcji kanonicznych).

Aby uzyskać informacje na temat wywoływania funkcji kanonicznych, bazy danych i niestandardowych z poziomu zapytań LINQ to Entities, zobacz Wywoływanie funkcji w zapytaniach LINQ to Entities.

Wykonywanie zapytania

Po utworzeniu zapytania LINQ przez użytkownika jest ono konwertowane na reprezentację zgodną z platformą Entity Framework (w postaci drzew poleceń), która jest następnie wykonywana względem źródła danych. W czasie wykonywania zapytania wszystkie wyrażenia zapytania (lub składniki zapytania) są oceniane na kliencie lub na serwerze. Obejmuje to wyrażenia, które są używane w materializacji wyników lub projekcjach jednostek. Aby uzyskać więcej informacji, zobacz Wykonywanie zapytań. Aby uzyskać informacje na temat zwiększania wydajności przez kompilowanie zapytania raz, a następnie wykonywanie go kilka razy przy użyciu różnych parametrów, zobacz Skompilowane zapytania (LINQ to Entities).

Materialization

Materializacja to proces zwracania wyników zapytania z powrotem do klienta jako typów CLR. W funkcji LINQ to Entities rekordy danych wyników zapytania nigdy nie są zwracane; Zawsze istnieje typ kopii zapasowej CLR zdefiniowany przez użytkownika lub program Entity Framework albo generowany przez kompilator (typy anonimowe). Cała materializacja obiektów jest wykonywana przez program Entity Framework. Wszelkie błędy, które wynikają z braku możliwości mapowania między programem Entity Framework i CLR, spowodują zgłaszanie wyjątków podczas materializacji obiektów.

Wyniki zapytania są zwykle zwracane jako jeden z następujących elementów:

  • Kolekcja obiektów jednostki typu zero lub więcej lub projekcja typów złożonych zdefiniowanych w modelu koncepcyjnym.

  • Typy CLR obsługiwane przez program Entity Framework.

  • Kolekcje wbudowane.

  • Typy anonimowe.

Aby uzyskać więcej informacji, zobacz Wyniki zapytania.

W tej sekcji

Zapytania w składniku LINQ to Entities

Wyrażenia w zapytaniach składnika LINQ to Entities

Wywoływanie funkcji w zapytaniach składnika LINQ to Entities

Zapytania skompilowane (LINQ to Entities)

Wykonywanie zapytania

Wyniki zapytania

Standardowe operatory zapytań w zapytaniach składnika LINQ to Entities

Metody mapowania kanonicznej funkcji CLR

Metody obsługiwane i nieobsługiwane LINQ (LINQ to Entities)

Znane problemy i zagadnienia dotyczące w składniku LINQ to Entities

Zobacz też