Operacja zapytania do modelu danych Entity Framework
Operacja umożliwia pobranie danych z modelu i powiązanie ich z nowo utworzonymi rekordami i polami.
Przypomnienie: elementy modelu danych definiujemy w edytorze struktur danych (EDMX). Patrz: dodawanie struktury danych.
Operacja jest umieszczana na rekordzie struktury danych i wymaga wskazania struktury modelu, do której kierujemy zapytanie. W naszym przykładzie będzie to SimplePerson.

Schematowo operacja powoduje uzupełnienie naszej struktury o pola występujące bezpośrednio pod strukturą modelu (z wyjątkiem pól binarnych) oraz rekordy słownikowe i podstruktury (grupy).
Na przykładzie poniżej operacja zapytania do modelu danych jest umieszczona na liście operacji z prawej strony jako druga. Natomiast operacja nr 1 dodaje pusty rekord, który wymaga od operacji Query data model wczytać również listę powiązaną o nazwie Children. Jeśli dodamy taki dostępny rekord relacji klikając prawym przyciskiem myszy na jakiś rekord ducha, to jest on automatycznie wyciągany przed operację zapytania.
- Rekordy powiązane i pola binarne pojawiają się jako podpowiedzi (duszki) i aby je załadować należy je dodać w menu kontekstowym: Popraw>Dodaj element.

- Spowoduje to przesunięcie operacji dodawania rekordów/pól przed naszą operację zapytania Query data model, co zostanie zinterpretowane jako polecenie dołączenia danych w momencie odczytu - na rysunku rekord Children. Więcej o dodawaniu pól binarnych list i podstruktur patrz: Dodawanie list, relacji i pól binarnych.

Właściwości operacji
Rekordy powiązane są fizycznie doczytywane dopiero przy pierwszym użyciu wartości w nich się znajdujących (lazy load). Oznacza to, że zaznaczenie rekordów do doczytania „na wyrost” nie powinno powodować negatywnych skutków wydajnościowych – nie wywołają one zbędnych zapytań SELECT. Opisywane tu opóźnione ładowanie można wyłączyć opcją we właściwościach – wówczas całe oznaczone drzewo danych zostanie załadowane w momencie wykonania oryginalnej operacji.
- Zaznacz operacje i na panelu Właściwości wybierz opcję Tak/Nie w polu Read WholeTree.

W trakcie przetwarzania danych operacja wykonuje odczyt z modelu wg ustalonych kryteriów. Najczęściej będzie to odczyt wg pojedynczego pola numerycznego o nazwie „Id” będącego prostym kluczem głównym w tabeli SQL. Dokładnie taką postać (rekord z jednym polem „Id”) ma schemat danych wejściowych formularza WWW, co w połączeniu z opisywaną tu operacją odczytu prowadzi do pożądanego rezultatu odczytu jednego rekordu z bazy danych. Dlatego ważne jest aby przy doczytywaniu innych tabel z bazy danych określić klucz główny.
Dla przykładu:
- Przeciągnij z serwera wersji strukturę danych, którą chcesz doczytać na puste miejsce w schemacie dnaych.
- Z menu kontekstowego wybierz opcję Edmx query.
- Możesz też dodać nowy rekord i przeciągnąć strukturę na rekord danych.

- W przypadku przeciągnięcia struktury na rekord należy w kolejnym poleceniu wybrać czy dodać nowy rekord (podrekord do rekordu Nowy rekord w tym przypadku) - opcja Kopiuj/dodaj nowy czy dostosować obecny rekord - opcja Dostosuj ten obiekt (adnotacje).

- Zarówno na liście operacji jak i obok rekordu na schemacie danych widać ostrzeżenie, iż nie określono żadnych kryteriów dla zapytania.

- Przeciągnij pole Id z FormInputStructure na pole Id z tabeli, którą chcesz doczytać do formularza. Z menu kontekstowego wybierz Ustaw źródło.

- Po wykonaniu akcji do pola Id została dodana adnotacja informująca o źródle wartości oraz rekord wielokrotny został zamieniony na pojedynczy, gdyż pole Id jest polem unikalnym stąd odczytany zawsze będzie 1 rekord z bazy danych.

Kryteria wyszukiwania można zmienić i rozbudować, dodając odpowiednie pola i ewentualnie adnotacje Porównanie. Pole modelu istniejące przed operacją odczytu jest interpretowane jako kolejne pole predykatu zapytania.
W przypadku zapytania o klucz główny operacja „wie”, że krotnością wyniku będzie „1”. W przypadku stosowania innych kryteriów, zapytań wg innego pola, operacja nie ma już takiej pewności i krotnością rekordu będzie „wiele”. Jeśli mamy pewność, że zawsze nasza operacja zwróci nie więcej, niż 1 rekord, możemy to zadeklarować we właściwościach naszej operacji i oszczędzić sobie konieczności obsługi możliwej wielokrotności w dalszej części logiki systemu.
Dla przykładu:
- Dodaj nowy rekord na schemacie danych, wczytaj tabelę z bazy danych.
- Ustaw kryterium wyszukiwania na polu innym niż pole Id.
- Przeciągnij pole Name z FormInputStructure na pole ClientName i z menu kontekstowego wybierz Ustaw źródło.
- Rekord nie zostanie zmieniony na wielokrotny i zostanie wyświetlona dodatkowa informacja (ikona z lupką), że to pole jest naszym kryterium wyszukiwania w bazie.
- Ważna jest także kolejność operacji. Operacja, która określa kryterium wyszukiwania danych w bzie danych jest jako 4 czyli przed operacją zapytania do modelu danych.

- Jeżeli zmienisz kolejność operacji, system zgłosi błąd, że nie zdefiniowano warunku wyboru danych z bazy, gdyż według listy operacji najpierw wykonywane jest zapytanie (operacja 4) a dopiero potem jest operacja zdefiniowania kryterium wyszukiwania danych z bazy, co jest błędem. W celu poprawy błędu wystarczy przesunąć operację w odpowiednie miejsce na panelu operacji.

- Jeżeli chcesz zmienić krotność rekordu zaznacz operację i na panelu Właściwości wybierz opcję Tak/Nie w polu ForceSingleQueryResponse.

Istnieje możliwość zapytania o dane bez żadnych kryteriów. Jest to operacja dość ciężka i niebezpieczna w przypadku dużych tabel, dlatego takie działanie wymaga włączenia opcji we właściwościach – swoistego potwierdzenia przez projektanta, że na pewno wie co robi.
- Na panelu Właściwości wybierz opcję Tak/Nie w polu AllowToReadWithoutConditions.

Wymagalność rekordu (lub listy) wynikowego jest domyślnie wyłączona – operacja w razie braku danych nie zgłosi błędu. Istnieje możliwość zmiany tego zachowania we właściwościach operacji – rekord będzie wymagany, ale kosztem błędu w trakcie działania w razie nie znalezienia rekordu.
- Opcja na panelu Właściwości FailOnNoData.

Podstawowym scenariuszem użycia opisywanej operacji są formularze WWW, w których ujemna wartość klucza głównego powoduje (w momencie zapisu danych) wykonanie dodania rekordu do modelu (i w efekcie stosownych poleceń INSERT). Zachowanie to jest domyślnie włączone, ale może być wyłączone przełącznikiem we właściwościach.
- Opcja na panelu Właściwości NewRecOnNegativeKey.

Powiązanie dwukierunkowe do modelu
Dane odczytywane opisywaną operacją powodują wytworzenie krótkotrwałego, dwukierunkowego powiązania między modelem a rekordami struktury danych. Zasięg tego powiązania to cały cykl życia żądanie-odpowiedź (w przypadku formularza, obejmujący ew. przeskoki w workflow i kodzie użytkownika). W przypadku bloczków przetwarzania masowego zasięg ten obejmuje pojedynczy bloczek mapowania. Istnieje też specjalna operacja EDMX checkpoint powodująca wykonanie synchronizacji z modelem danych i pobranie wartości nowo utworzonych kluczy. Więcej patrz: Operacja punktu kontrolnego integracji z modelem Entity Framework.
Powiązanie powoduje, że w razie wykonania zapisu danych formularza (lub na końcu bloczka mapowania „masowego”) wszystkie zmiany pól powiązanych zostaną zapisane w modelu danych, co wywoła stosowne polecenia UPDATE w bazie danych. Powiązanie takie można w razie potrzeby wyłączyć we właściwościach operacji.
- Opcję możesz zmienić na panelu Właściwości w sekcji BindData.

Inną metodą pobierania danych w ramach operacji mapowań jest: Operacja zapytania SQL.
W pakietach przetwarzania istnieją jeszcze inne metody doczytywania złożonych danych, posiadające inne wymagania i charakterystyki działania:
- odczyt danych zdenormalizowanych poleceniami zawierającymi złączenia (JOIN) i późniejsza ich normalizacja do drzew,
- użycie bloczków zapytań i odczytu z bazy (LoopJoin) lub złączenia posortowanych strumieni (MergeJoin).
Przykład:
Mamy prostą, rekurencyjną strukturę danych reprezentującą osoby:

W bazie danych nasza struktura będzie wyglądać tak:

Załóżmy, że mamy w tabeli kilka rekordów układających się koncepcyjnie w następujące drzewo:

.. i chcemy przy pomocy opisywanej operacji uzyskać strukturę danych i rekordy wyglądające mniej więcej tak:

Załóżmy też, że nie chcemy wykonywać naszego zapytania bezpośrednio w korzeniu struktury (nie ma takiego obowiązku), a o jeden poziom niżej.
- W tym celu dodajemy rekord Roots i przyczepiamy mu operację odpytania struktury SimplePerson modelu Entity Frameworka. Można to zrobić z menu kontekstowego rekordu, można upuścić naszą strukturę z Serwera wersji i wybrać polecenie zapytanie.
- Następnie oznaczamy na podpowiedziach rekordów Childrendwa poziomy do włączenia do wczytania do naszego rekordu.
- Oznaczamy też pole ParentId aby istniało i posiadało wartość pustą (wyrażeniem), co spowoduje, że w korzeniu naszych danych będą znajdowały się tylko rekordy z pustą wartością w polu ParentId.
Powinniśmy uzyskać następujący układ operacji mapowania:
