2009-09-14 5 views
11

Qualche consiglio su quando DataTable.Select dovrebbe essere usato contro LINQ Select quando si tratta di un DataTable in memoria?DataTable Selezionare vs LINQ Select

Trovo la sintassi LINQ più semplice e più potente, ma non sono sicuro se ci sono prestazioni o altri problemi che rendono preferibile selezionare DataTable.

(sto usando una terza parte che fornisce API di un DataTable che è stato pre-popolato dal database. Ho bisogno di filtrare che ulteriori in memoria.)

risposta

9

Sulla base dell'esperienza personale, cerco di evitare Datatable.Select. Trovo che sia lento e ha alcuni bug strani.

Uno dei bug (confermato e documentato da Microsoft) in cui mi sono imbattuto era che DataTable.Select non sempre valuta AND correttamente quando ci sono parentesi nell'istruzione.

Ad esempio, (Col1> 1) E (Col < 10) non riesce a restituire le risposte corrette, mentre Col1> 1 E Col < 10 funzionerà correttamente.

Questo bug non viene visualizzato su tutti i computer. Nel mio caso il controllo che stavo usando andava bene sulla mia piattaforma di sviluppo e su ogni computer client tranne uno. Dopo aver scoperto questo errore, ho iniziato a utilizzare LINQ per selezionare e ho notato un aumento significativo della velocità delle operazioni.

Nota a margine: senza approfondire le spiegazioni, la mia azienda non utilizza un database per archiviare i dati. Tutte le delle nostre operazioni con DataTables riguardano tabelle di memoria caricate da file flat.Quindi non sto parlando di LINQ 2 SQL, ma LINQ to Dataset.

0

Hmm, stai confrontando i set di dati con LINQ to SQL ? Se lo sei, allora direi di buttare via i set di dati e andare con L2S. DataTable.Select presume che tu abbia già popolato il datatable con i dati. Ciò può portare a progetti non validi in cui si caricano più dati del necessario, solo per filtrare nel client. Ottieni SQL Server per eseguire le tue query e lavora sul set di risultati che ti offre. L2S leggerà dal database solo quando iterate la raccolta, quindi è molto più semplice formulare le vostre query prima del colpendo il database.

LINQ to SQL introduce un sovraccarico di debug perché può essere scomodo per ottenere l'SQL generato dinamicamente da esso (mentre nei set di dati si fornisce l'SQL in primo luogo), ma in quasi tutte le altre situazioni è molto più elegante. La funzionalità deferred loading è particolarmente utile.

Se non si sta lavorando con un database, preferirei comunque LINQ (noto come LINQ to Objects in questo scenario) sui set di dati. La sintassi è molto più semplice, e poiché non ci sono stringhe magiche (cioè istruzioni SQL), è più facile da testare e si ricevono avvisi in fase di compilazione per errori di battitura ecc.

+0

Grazie per la risposta. Avrei dovuto chiarire che non ho interazione con il database. Aggiornerò la domanda –

+0

Ah abbastanza giusto. Ho aggiornato la mia risposta su questa base. –

2

Senza nemmeno menzionare LINQ, non userei DataTable. Selezionare ovunque a meno che non sia assolutamente necessario, poiché nella maggior parte dei casi significa eseguire nel client qualcosa che probabilmente dovrebbe essere eseguito nel database.

Aggiornamento: la mia risposta qui è probabilmente un po 'esagerata. Lì sono a volte motivi legittimi per l'utilizzo di un DataTable come un (auspicabilmente) piccolo database in memoria che riduce al minimo i round trip da client a database.

+0

Assolutamente - anche se questo è un caso "assolutamente da avere". Lavorare con un'API di terze parti. –