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

and*_*ndy 8 .net linq vb.net extension-methods

嘿伙计们,所以我遇到了一些可能是Extension方法.CopyToDataTable中的缺陷.

导入(在VB.NET中)System.Data.DataTableExtensions然后针对IEnumerable调用该方法使用此方法.如果要使用LINQ过滤数据表,然后在最后还原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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,"WHERE"过滤可能不会返回任何结果.如果发生这种情况,CopyToDataTable会抛出异常,因为没有DataRows.

为什么?

正确的行为应该是返回一个Rows.Count = 0的DataTable.

任何人都可以想到一个干净的解决方法,以这种方式调用CopyToDataTable谁不必知道这个问题?

System.Data.DataTableExtensions是一个静态类,所以我无法覆盖行为....任何想法?我错过了什么吗?

干杯

更新:

我已将此问题提交给Connect.我仍然想要一些建议,但如果您同意我的意见,可以通过上面的链接在Connect上投票

干杯

Vin*_*nce 12

someDataTable.AsEnumerable().Where(r => r.Field<string>("SomeField") == "SomeValue").AsDataView().ToTable();
Run Code Online (Sandbox Code Playgroud)

.AsDataView().ToTable()返回一个空表,其结构与someDataTable现在返回的行相同.Where()


and*_*ndy 2

在 Microsoft 修复此问题之前,可以采取以下解决方法:

创建您自己的扩展方法,如果有 DataRow,则使用 CopyToDataTable 方法,如果没有,则返回一个空的 DataTable。

网络

    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
Run Code Online (Sandbox Code Playgroud)

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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个错误;而是一个错误。这种行为很大程度上是有意而为之的。`CopyToDataTable` 要做的第一件事就是抓取一行,找到基础表,然后将列复制到新的 `DataTable` 中。您的解决方法会创建一个没有列的空“DataTable”。您可以在数据源中避免这种情况(如果表没有行,它不会查看表),但在其他情况下则不能。 (2认同)