Dot-Net
如何處理 System.Data.DataTableExtensions.CopyToDataTable() 中的缺陷
我遇到了一些可能是 Extension 方法中的缺陷
.CopyToDataTable。此方法由 Importing(在 VB.NET 中)使用
System.Data.DataTableExtensions,然後針對 IEnumerable 呼叫該方法。如果您想使用 LINQ 過濾數據表,然後在最後恢復數據表,您可以這樣做。IE:
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”過濾可能不返回任何結果。如果發生這種情況,CopyToDataTable 會拋出異常,因為沒有 DataRows。
為什麼?
正確的行為應該是返回 Rows.Count = 0 的 DataTable。
誰能想到一個乾淨的解決方法,這樣呼叫 CopyToDataTable 的人就不必知道這個問題?
System.Data.DataTableExtensions 是一個靜態類,因此我無法覆蓋該行為。有任何想法嗎?我錯過了什麼嗎?
更新:
我已將此作為問題送出給Connect。我仍然想要一些建議,但如果你同意我的觀點,你可以通過上面的連結在 Connect 上投票贊成這個問題
乾杯
在 Microsoft 解決此問題之前,這裡有一個解決方法:
創建自己的擴展方法,如果有 DataRows,則使用 CopyToDataTable 方法,如果沒有,則返回一個空的 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 NamespaceC#;
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); } } }
someDataTable.AsEnumerable().Where(r => r.Field<string>("SomeField") == "SomeValue").AsDataView().ToTable();
.AsDataView().ToTable()返回一個空表,其結構與someDataTable現在返回的行相同.Where()