为什么使用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有什么区别?
这里的问题是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>()