Dot-Net

如何處理 System.Data.DataTableExtensions.CopyToDataTable() 中的缺陷

  • August 16, 2020

我遇到了一些可能是 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 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);
           }
       }
   }
someDataTable.AsEnumerable().Where(r => r.Field<string>("SomeField") == "SomeValue").AsDataView().ToTable();

.AsDataView().ToTable()返回一個空表,其結構與someDataTable現在返回的行相同.Where()

引用自:https://stackoverflow.com/questions/636765