加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么LINQ使用Data.DataTableCollection进行转换

发布时间:2020-12-16 01:55:00 所属栏目:百科 来源:网络整理
导读:这个问题是“LINQ使用Data.DataTableCollection”连续问题,这里是链接[问题] LINQ casting with a Data.DataTableCollection @Lasse Espeholt 我遇到同样的情况.我想对集合DataTableCollection进行LINQ查询.但是,如果我写下以下代码: from dataTable in dat
这个问题是“LINQ使用Data.DataTableCollection”连续问题,这里是链接[问题] LINQ casting with a Data.DataTableCollection @Lasse Espeholt

我遇到同样的情况.我想对集合DataTableCollection进行LINQ查询.但是,如果我写下以下代码:

from dataTable in dataSet.Tables

visual studio将报告错误“无法找到源类型’System.Data.DataTableCollection’的查询模式的实现”.所以解决方案是将代码更改为:

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

所以我从互联网上挖掘了根本原因.我发现了一些线索,“典型的LINQ to Objects查询表达式不仅需要一个实现IEnumerable的类作为其数据源,而且它还返回一个相同类型的实例.”在this page.所以我想知道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中添加了.

虽然微软本可以在existig框架类型上添加这个通用接口,但我猜测它们并不是因为时间限制,风险和有限的用途.

有许多旧类可以从这个通用接口中受益(有时候他们缺少那个接口很烦人),但添加它需要花费大量时间来实现和测试向后兼容性.更改现有内容包括破坏现有应用程序的风险. .NET设计人员对引入重大变化非常保守.

所以我认为他们计算出的成本高于收益,因为这些旧类型将来不会在新工具的可用性中使用那么多.此外,您已经找到了Enumerable.Cast< T>(Enumerable)扩展方法形式的简单解决方法.

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

from DataTable dataTable in dataSet.Tables

其中的内容转换为:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读