2014-06-05 12 views
8

Per me, PetaPoco Database.Fetch e Database.Query sembrano fare la stessa cosa.Qual è la differenza tra Fetch e Query?

Per esempio,

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

C'è qualche differenza significativa tra di loro?

+2

E come è quello relativo al server sql? Controlla la documentazione di petapoco. – TomTom

risposta

16

Secondo il PetaPoco documentation, questa è la risposta:

Query vs Fetch

La classe Database ha due metodi per recuperare i record di query e Fetch. Sono praticamente identici, tranne che Fetch restituisce un elenco <> di POCO mentre Query utilizza il rendimento restituito per scorrere i risultati senza caricare l'intero set in memoria.

+0

C'è un modo per disattivare i metodi che funzionano ottenendo l'intero set di dati e quindi filtrando il lato client? Questo è così pericoloso (dal punto di vista delle prestazioni) che non voglio nemmeno che questi metodi siano disponibili per me. – NickG

+0

@NickG - dubito che sia ciò che viene suggerito qui. Sono abbastanza sicuro che tutto il filtraggio è fatto lato server. E 'solo una questione se i risultati sono o meno ottenuti in un 'IEnumerable ', o caricati in un 'Elenco ' – Jim

+0

@Jim Ho confermato tramite una traccia che il filtro NON è fatto lato server e passa l'intero tavolo a .NET da filtrare lato client. In quanto tale, Fetch dovrebbe essere evitato laddove possibile e Query usato di preferenza. Vedi la mia domanda qui: 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

Fetch e query si comportano in modo diverso se li si utilizza all'interno di una transazione. Avevo un caso d'uso in cui avevo bisogno di aggiornare diverse tabelle in una transazione, ma avevo bisogno di recuperare alcuni dati da una tabella di riferimento nel mezzo della sequenza.

Quando ho recuperato i dati con query e successive inserti o aggiornamenti fallito con un'InvalidOperationException: "C'è già un DataReader aperto associato con questo comando che deve essere chiuso prima"

La soluzione era quella di sostituire la query con un recupero e sono stato in grado di completare la sequenza.

Il pseudocodice per questo è:

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

Problemi correlati