Próbowałem przeprowadzić wiele badań, ale jestem bardziej typem db - więc nawet wyjaśnienie w MSDN nie ma dla mnie żadnego sensu. Czy ktoś może wyjaśnić i podać kilka przykładów, jakie Include()
stwierdzenie robi w SQL
zapytaniu?
96
Odpowiedzi:
Załóżmy na przykład, że chcesz uzyskać listę wszystkich swoich klientów:
I załóżmy, że każdy
Customer
obiekt ma odniesienie do swojego zbioruOrders
i że każdyOrder
ma odniesienia, doLineItems
których może również odnosić się plikProduct
.Jak widać, wybranie obiektu najwyższego poziomu z wieloma powiązanymi jednostkami może skutkować zapytaniem, które będzie musiało pobrać dane z wielu źródeł. Jako miara wydajności
Include()
umożliwia wskazanie, które powiązane jednostki powinny być odczytywane z bazy danych w ramach tego samego zapytania.Korzystając z tego samego przykładu, może to spowodować wprowadzenie wszystkich powiązanych nagłówków zamówień, ale żadnych innych rekordów:
Na koniec, ponieważ poprosiłeś o SQL, pierwsza instrukcja bez
Include()
może wygenerować prostą instrukcję:SELECT * FROM Customers;
Końcowe stwierdzenie, które wywołuje,
Include("Orders")
może wyglądać tak:SELECT * FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
źródło
LineItems
iProducts
, zapytanie LINQ powinno wyglądać następującovar customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems").Include("Products").ToList();
:?Include()
celu przechwytywania obiektów wzdłuż różnych „ścieżek”. Jeśli chcesz, aby obiekty znajdowały się na tej samej ścieżce, musisz wykonać tylko jedno wywołanie, które określa całą ścieżkę. PonieważLineItems
iProducts
nie współdzielą żadnych komponentów ścieżki, potrzebujesz oddzielnych wywołań.Chciałem tylko dodać, że „Uwzględnij” jest częścią niecierpliwego ładowania. Jest to opisane w samouczku Entity Framework 6 firmy Microsoft. Oto link: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the -entity-framework-in-an-asp-net-mvc-application
Fragment z połączonej strony:
źródło
Potraktuj to jako wymuszanie szybkiego ładowania w scenariuszu, w którym podelementy ładowałyby się leniwie.
Kwerenda EF wysyła do bazy danych na początku przyniesie większy wynik, ale podczas uzyskiwania dostępu nie będą wykonywane żadne dalsze zapytania podczas uzyskiwania dostępu do uwzględnionych elementów.
Z drugiej strony bez tego EF wykonywałby oddzielne zapytania później, kiedy po raz pierwszy uzyskasz dostęp do elementów podrzędnych.
źródło