Domanda

In realtà, questa è la stessa domanda di questo post:

Come posso verificare se la mia query LINQ eseguire quando viene chiamato in mio DAL, non in ritardo di moda?

Ma poiché egli non ha spiegato perché egli ha voluto che, la questione sembra essere stato passato sopra un po'.Ecco il mio simile-ma-meglio-ha spiegato il problema:

Ho una manciata di fili in due tipi (ignorando UI thread per un momento).C'è una "raccolta dei dati" tipo filettatura, e "calcolo" il tipo di filettatura.La raccolta dei dati di thread sono lenti.C'è un bel po ' di dati per essere passato al setaccio da una varietà di luoghi.Il calcolo thread sono relativamente veloce.Il design del modello, fino a questo punto è quello di inviare i dati di raccolta di thread per trovare i dati, e quando sono pronte passare i dati per il calcolo.

Quando scrissi la mia raccolta di dati in Linq ho finito il sollevamento di alcuni di che la lentezza nel mio calcolo thread.Ora ci sono elementi di dati che non sono risolti completamente fino a quando sono usati durante il calcolo -- e questo è un problema.

Mi piacerebbe forza Linq per finire il suo lavoro in un dato momento (fine istruzione?fine del metodo?"si prega di finire, dannazione" chiamata di metodo) in modo che io sappia non ho intenzione di pagare più tardi.L'aggiunta ".ToList()" al fine di Linq è 1.imbarazzante, e 2.si sente come la boxe qualcosa che sta per essere unboxed in un altro thread momentaneamente comunque.

È stato utile?

Soluzione

Non sarebbe boxe niente - tu saresti il buffering i risultati.

Utilizzando ToList() è fondamentalmente il modo per andare se si desidera che in realtà i dati.A meno che non sei pronto ad utilizzare i dati immediatamente, deve essere tamponata da qualche parte,, non credi?Un elenco è solo un modo comodo per farlo.

L'alternativa è fare il trattamento, e di come utilizzare i dati come si produce, con entusiasmo.Non ho abbastanza seguire i vari thread lato della cosa, quindi non mi è chiaro se questo potrebbe aiutare, ma questi sono fondamentalmente le scelte disponibili per voi, a quanto posso vedere.

Questo è in realtà un po' esplicito nella descrizione:

Il design del modello, fino a questo punto per inviare raccolta dei dati filetti fuori per trovare i dati, e quando sono pronte passare i dati per il calcolo.

Chiamata ToList() in pratica cambia ciò che è di ritorno da "una query che può recuperare i dati quando viene richiesto di" per "i dati, memorizzati in un elenco".

Altri suggerimenti

Può spiegare di più perché ToList non è accettabile? Lei ha parlato di boxe e unboxing ma quelli sono completamente argomenti estranei.

Parte di forzare una query LINQ per completare su richiesta richiede la memorizzazione dei risultati. In caso contrario, al fine di rivedere i risultati, dovreste repprocess la query. .ToList realizza efficacemente questa memorizzando gli elementi in un List<T>.

E 'possibile memorizzare gli elementi in qualsiasi altra struttura dati di stile di raccolta con i vari compromessi che possono soddisfare le vostre esigenze meglio.

C'è un LoadOptions proprietà nella DataContext classe che potrebbe aiutare a recuperare i dati più volentieri.

Altrimenti si potrebbe usare alcuni intelligente posizionato ToList() 's.

So che questa discussione è vecchio ... comunque, divertente nessuno ha menzionato .ToLast () ancora. Sto facendo qualcosa in cui LINQ non è molto più di un foreach glorificato guida alcuni effetti collaterali in cui non mi importa del risultato della query ... quindi non ho voglia di allocare la memoria più fasullo del necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top