Mam metodę w moim generowanego częściowej klasy tak:.Skip() Take() na Entity Framework Właściwości nawigacji wykonuje SELECT * na moim SQL Server
var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();
Kiedy patrzę na mojego serwera SQL , Widzę, że wygenerowany kod robi kod SELECT *.* FROM Children
Ten kod pochodzi bezpośrednio z mojej klasy. Sprawdziłem, czy kolejność mojego Skip/Take jest PRZED moją .ToList.
Jeśli usunąć .ToList, że linia jest szybka (i nie SQL jest wysyłane do mojego DB), ale moment staram się foreach
nad wynikami, mam ten sam SQL wysyłane do mojego DB: SELECT *.* FROM Children
.
Czy jest coś szczególnego, co muszę zrobić podczas korzystania z .Potkania i .Take na właściwości nawigacji moich obiektów?
aktualizacja
Postaram się uzyskać rzeczywiste SQL generowane, nie jestem obecnie setup do tego. Znalazłem pierwszy, ponieważ pojawia się na liście "recenty drogich zapytań" SSMS.
Running to:
var pChildren = this.Children
//.Skip(skipRelated)
//.Take(takeRelated)
.ToList();
powraca ~ 4.000.000 wierszy i trwa ~ 25 sekund.
Running to:
var pChildren = this.Children
//.Skip(skipRelated)
.Take(takeRelated)
.ToList();
powraca ~ 4.000.000 wierszy i trwa ~ 25 sekund.
Jak już powiedziałem, pobieram wygenerowany SQL dla nich i również je zgłaszam.
Co SQL nie można oczekiwać, aby wygenerować ten kod? – cdhowie
Miałem nadzieję na coś takiego jak "WYBIERZ TOP 10 OD DZIECI GDZIE ParentID = @ idOfParentEntity" (Zapomniałem, jak EF radzi sobie z .Skipem, ale czytałem, że powinno to zrobić.Jeśli wykonam to zapytanie bezpośrednio w moim kontekście, wydaje mi się, że ograniczyć dane zwrócone do konkretnej "strony") – Nate
Obecność '.Skip()' wyklucza użycie 'TOP'. O ile nie spodziewałeś się, że zsumuje 'skipRelated' i' takeRelated' i użyje tego jako parametru 'TOP' ... który może być optymalizacją, ale może również nie mieć wpływu na wydajność. – cdhowie