Ciao ragazzi, quindi mi sono imbattuto in qualcosa che è forse un difetto nel metodo Extension .CopyToDataTable.Come gestire un difetto in System.Data.DataTableExtensions.CopyToDataTable()
Questo metodo è utilizzato da Importazione (in VB.NET) System.Data.DataTableExtensions e quindi chiamando il metodo su un oggetto IEnumerable. Lo si farebbe se si desidera filtrare un Datatable utilizzando LINQ e quindi ripristinare il DataTable alla fine.
cioè:
Imports System.Data.DataRowExtensions
Imports System.Data.DataTableExtensions
Public Class SomeClass
Private Shared Function GetData() As DataTable
Dim Data As DataTable
Data = LegacyADO.NETDBCall
Data = Data.AsEnumerable.Where(Function(dr) dr.Field(Of Integer)("SomeField") = 5).CopyToDataTable()
Return Data
End Function
End Class
Nell'esempio precedente, il "dove" filtraggio potrebbe restituire risultati. Se ciò accade, CopyToDataTable genera un'eccezione perché non esistono DataRows.
Perché?
Il comportamento corretto dovrebbe essere quello di restituire un DataTable con Rows.Count = 0.
Qualcuno può pensare a una soluzione pulita per questo, in modo tale che chi chiama CopyToDataTable non deve essere a conoscenza di questa edizione?
System.Data.DataTableExtensions è una classe statica, quindi non posso ignorare il comportamento ... qualche idea? Ho perso qualcosa?
applausi
UPDATE:
Ho presentato questo come un problema da Connect. Vorrei ancora alcuni suggerimenti, ma se siete d'accordo con me, si potrebbe votare la questione in Connetti tramite il link qui sopra
applausi
Penso che questo potrebbe essere leggermente migliorato per usare '! Source.Any()' invece di 'Source.Count() == 0'. 'Any' si fermerà non appena avrà trovato alcun risultato. – row1
Molto più che leggermente –
Questo non è un bug; il comportamento è molto designato e deliberato.Una delle prime cose che "CopyToDataTable" fa è prendere una riga, trovare la tabella sottostante e copiare le colonne nel nuovo 'DataTable'. La tua soluzione alternativa crea un 'DataTable' vuoto senza colonne. Puoi farla franca in un DataSource (non guarderà la tabella se non ha righe), ma in altri scenari non puoi. – Brian