Hé les gars, alors je suis venu à travers quelque chose qui est peut-être une faille dans la méthode d'extension .CopyToDataTable.Comment faire face à une faille dans System.Data.DataTableExtensions.CopyToDataTable()
Cette méthode est utilisée par l'importation (en VB.NET) System.Data.DataTableExtensions puis appeler la méthode contre un IEnumerable. Vous le feriez si vous souhaitez filtrer une Datatable à l'aide de LINQ, puis restaurer le DataTable à la fin.
i.e.:
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
Dans l'exemple ci-dessus, le filtrage "WHERE" pourrait retourner aucun résultat. Si cela se produit, CopyToDataTable lève une exception car il n'y a pas de DataRows.
Pourquoi?
Le comportement correct devrait être de retourner un DataTable avec Rows.Count = 0.
Quelqu'un peut-il penser à une solution propre à cela, de telle sorte que quiconque invoquera CopyToDataTable ne pas être au courant de ce problème?
System.Data.DataTableExtensions est une classe statique je ne peux pas remplacer le comportement .... des idées? Ai-je manqué quelque chose?
acclamations
MISE À JOUR:
J'ai présenté cela comme un problème à Connect. Je voudrais encore quelques suggestions, mais si vous êtes d'accord avec moi, vous pourriez voter la question à se connecter via le lien ci-dessus
acclamations
Je pense que cela pourrait être légèrement amélioré pour utiliser '! Source.Any()' au lieu de 'Source.Count() == 0'. 'Any' s'arrêtera dès qu'il trouvera des résultats. – row1
Beaucoup plus que légèrement –
Ce n'est pas un bug; le comportement est très conçu et délibéré.L'une des premières choses que 'CopyToDataTable' fait est saisir une ligne, trouver la table sous-jacente, et copier les colonnes dans votre nouveau' DataTable'. Votre solution de contournement crée un 'DataTable' vide sans colonnes. Vous pouvez vous en sortir avec un DataSource (il ne regardera pas la table s'il n'a pas de ligne), mais dans d'autres cas, vous ne pouvez pas le faire. – Brian