おそらく Extension メソッドの欠陥である何かに遭遇しました.CopyToDataTable
。
このメソッドは、(VB.NET で) インポートSystem.Data.DataTableExtensions
してから、IEnumerable に対してメソッドを呼び出すことによって使用されます。LINQ を使用して Datatable をフィルター処理し、最後に DataTable を復元する場合は、これを行います。
すなわち:
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
上記の例では、「WHERE」フィルタリングは結果を返さない可能性があります。これが発生した場合、DataRows がないため、CopyToDataTable は例外をスローします。
なんで?
正しい動作は、Rows.Count = 0 の DataTable を返すことです。
CopyToDataTable を呼び出す人がこの問題を意識する必要がないように、これに対する明確な回避策を考えられる人はいますか?
System.Data.DataTableExtensions は静的クラスであるため、動作をオーバーライドできません。何か案は?私は何かを逃しましたか?
アップデート:
これを問題としてConnectに提出しました。引き続きいくつかの提案をお願いしますが、私に同意する場合は、上記のリンクから Connect で問題に投票してください。
乾杯