为什么使用Data.DataTableCollection进行LINQ强制转换?

本文关键字:转换 LINQ 进行 Data DataTableCollection 为什么 | 更新日期: 2023-09-27 18:15:43

这个问题是一个连续的"LINQ casting with a Data "问题。DataTableCollection",这里是链接[问题]LINQ转换与一个数据。DataTableCollection @Lasse Espeholt

我遇到同样的情况。我想做LINQ查询收集DataTableCollection。但是如果我写下下面的代码:

from dataTable in dataSet.Tables

visual studio将报告一个错误"无法找到源类型'System.Data.DataTableCollection'的查询模式的实现"。因此,解决方案是将代码更改为:

from dataTable in dataSet.Tables.Cast<DataTable> ()

所以我从网上找到了根本原因。我发现了一些线索,"一个典型的LINQ到对象查询表达式不仅接受一个实现IEnumerable的类作为其数据源,而且还返回一个相同类型的实例。"所以我想知道DataTableCollection不继承接口IEnumerable。但是根据我在MSDN中检查,我发现DataTableCollection的继承关系如下:

DataTableCollection
    InternalDataCollectionBase
        ICollection
            IEnumerable

这个继承关系意味着DataTableCollection只继承接口IEnumerable,不继承接口IEnumerable。所以它不能支持LINQ查询。解决方法是使用cast方法转换为IEnumerable,然后可以做LINQ查询。

所以我的总结作为一个想要启用LINQ对象功能的类,它必须继承IEnumerable和IEnumerable两个接口。

我的总结对吗?IEnumerable和IEnumerable有什么区别?

为什么使用Data.DataTableCollection进行LINQ强制转换?

这里的问题是DataTableCollection没有实现通用的IEnumerable<T>接口。这个接口是在。net 2.0中添加的,它继承了早期的非泛型IEnumerable接口。LINQ查询需要这个泛型接口,不能使用非泛型版本。

DataTableCollection是一个在2.0之前可用的类,而通用的IEnumerable<T>是在。net 2.0中添加的。

虽然微软可以在现有的框架类型上添加这个通用接口,但我的猜测是,由于时间限制、风险和有限的实用性,他们没有这样做。

有很多旧的类可以从这个泛型接口中受益(有时缺少这个接口是相当烦人的),但是添加这个需要大量的时间来实现和测试向后兼容性。更改现有的内容包含破坏现有应用程序的风险。. net的设计者对于引入突破性的变化是非常保守的。

所以我认为他们计算的成本高于收益,因为那些旧类型在未来新工具可用性的情况下不会被大量使用。此外,还有一个简单的解决方法,即您已经找到的Enumerable.Cast<T>(Enumerable)扩展方法。

c# LINQ语言实现甚至内置了对这个Cast<T>方法的支持;它可以写成如下:

from DataTable dataTable in dataSet.Tables

在被子下面翻译成:

from dataTable in dataSet.Tables.Cast<DataTable>()