Hola chicos, me he topado con algo que tal vez sea un error en el método de extensión .CopyToDataTable.Cómo lidiar con un error en System.Data.DataTableExtensions.CopyToDataTable()
Este método se utiliza importando (en VB.NET) System.Data.DataTableExtensions y luego llamando al método contra un IEnumerable. Haría esto si quiere filtrar una tabla de datos usando LINQ, y luego restaurar la DataTable al final.
es decir:
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
En el ejemplo anterior, el "dónde" filtrado podría no producirá ningún resultado. Si esto sucede, CopyToDataTable arroja una excepción porque no hay DataRows.
¿Por qué?
El comportamiento correcto debe ser para devolver un DataTable con Rows.Count = 0.
¿Puede alguien pensar en una solución limpia para esto, de tal manera que todo aquel que invoque CopyToDataTable no tiene que ser consciente de ¿este problema?
System.Data.DataTableExtensions es una clase estática por lo que no puedo anular el comportamiento ... alguna idea? ¿Me he perdido algo?
aplausos
ACTUALIZACIÓN:
he presentado esto como un problema a Connect. Todavía me gustaría algunas sugerencias, pero si está de acuerdo conmigo, que podría votar la cuestión en Conectar mediante el enlace anterior
aplausos
Creo que esto podría mejorarse ligeramente para usar '! Source.Any()' en lugar de 'Source.Count() == 0'. 'Any' se detendrá tan pronto como encuentre algún resultado. – row1
Mucho más que un poco –
Esto no es un error; el comportamiento es mucho por diseño y deliberado.Una de las primeras cosas que 'CopyToDataTable' hace es tomar una fila, encontrar la tabla subyacente y copiar las columnas en su nueva' DataTable'. Su solución crea un 'DataTable' vacío sin columnas. Puede salirse con la suya en un DataSource (no mirará la tabla si no tiene filas), pero en otros escenarios no puede. – Brian