How to deal with a flaw in System.Data.DataTableExtensions.CopyToDataTable()
someDataTable.AsEnumerable().Where(r => r.Field<string>("SomeField") == "SomeValue").AsDataView().ToTable();
.AsDataView().ToTable()
returns an empty table with the same structure as someDataTable
if there are now rows returned from .Where()
Until Microsoft fix this issue, here's a work around:
Create your own Extension method which uses the CopyToDataTable method if there are DataRows, if there aren't, then it returns an empty DataTable.
VB.NET
Imports System.Data
Namespace CustomExtensions
Public Module DataRowExtensionsOverride
<System.Runtime.CompilerServices.Extension()> _
Public Function CopyToDataTableOverride(Of T As DataRow)(ByVal Source As EnumerableRowCollection(Of T)) As DataTable
If Source.Count = 0 Then
Return New DataTable
Else
Return DataTableExtensions.CopyToDataTable(Of DataRow)(Source)
End If
End Function
End Module
End Namespace
C#;
public static class DataRowExtensionsOverride
{
public static DataTable CopyToDataTableOverride<T>(this IEnumerable<T> Source) where T : DataRow {
if (Source.Count() == 0) {
return new DataTable();
} else {
return DataTableExtensions.CopyToDataTable<T>(Source);
}
}
}