2014-06-05 15 views
8

Wydaje mi się, że PetaPoco ma Database.Fetch i Database.Query robi to samo.Jaka jest różnica między Fetch a Query?

Na przykład

var db = new PetaPoco.Database("myDB"); 
ProductList products = db.Fetch<ProductList>("SELECT * FROM ProductList"); 
ProductList products = db.Query<ProductList>("SELECT * FROM ProductList"); 

Czy istnieje istotna różnica między nimi?

+2

A jak jest powiązany z serwerem sql? Sprawdź dokumentację petapoco. – TomTom

Odpowiedz

16

Według PetaPoco documentation, to jest odpowiedź:

Zapytanie vs Fetch

Klasa Database dwie metody pobierania rekordów zapytania i Fetch. Są one prawie identyczne, z wyjątkiem Fetch zwraca listę <> z POCO, podczas gdy Query używa powrotu zysku do iteracji wyników bez wczytywania całego zestawu do pamięci.

+0

Czy istnieje sposób, aby wyłączyć metody, które działają poprzez pobranie całego zestawu danych, a następnie filtrowanie po stronie klienta? Jest to tak niebezpieczne (z perspektywy wydajności), że nawet nie chcę tych metod dostępnych dla mnie. – NickG

+0

@NickG - wątpię, że to właśnie sugeruje się tutaj. Jestem pewien, że wszystkie filtry są wykonywane po stronie serwera. Chodzi tylko o to, czy wyniki zostaną przedstawione w "IEnumerable ", czy też zostaną załadowane na listę 'List ' – Jim

+0

@Jim Mam potwierdzone przez śledzenie, że filtrowanie NIE jest wykonywane po stronie serwera i przekazuje cały stół do .NET do filtrowania po stronie klienta. W związku z tym należy unikać pobierania w miarę możliwości i używać preferencji. Zobacz moje własne pytanie tutaj: http://stackoverflow.com/questions/38128988/is-it-normal-for-npoco-petapoco-fetch-to-get-all-data-and-then-filter-client-s/ 38173886 # 38173886 – NickG

0

Pobieranie i zapytanie zachowują się inaczej, jeśli używasz ich w ramach transakcji. Miałem przypadek użycia, w którym potrzebowałem zaktualizować kilka tabel w jednej transakcji, ale musiałem pobrać niektóre dane z tabeli referencyjnej w środku sekwencji.

Kiedy pobierane dane z kwerendy i kolejnych wkładek lub aktualizacje nie powiodło się z InvalidOperationException: „Nie ma już otwartą DataReader skojarzony z tym poleceniem, które muszą być zamknięte pierwszy”

Rozwiązaniem było wymienić Query z Fetchiem i udało mi się ukończyć sekwencję.

pseudokod na to:

BeginTransaction Update Tbl1 Update Tbl2 Query RefTblA ## Changed Query to Fetch to avoid: '...already an open DataReader..." exception Update Tbl3 using data from RefTblA CompleteTransaction

Powiązane problemy