【发布时间】:2019-06-25 01:08:53
【问题描述】:
如何将 linq 的结果返回给 DataTable ?
我正在尝试这个帖子的解决方案:
Select all records of a datatable with duplicate values
但它无法为我编译。
这是我的代码
IEnumerable<DataRow> dtrow = default(IEnumerable<DataRow>);
dtrow = dtTable.AsEnumerable().GroupBy(x => x["MerkTypeID"]).Where(x => x.Count() > 1);
using (DataTable table = dtrow.CopyToDataTable())
{
}
但是VS给出了这个错误
错误 CS0266 无法隐式转换类型
System.Collections.Generic.IEnumerable<System.Linq.IGrouping<object, System.Data.DataRow>>到System.Collections.Generic.IEnumerable<System.Data.DataRow>。一个 存在显式转换(您是否缺少演员表?)
我也这样尝试过
var dtrow = dtTable.AsEnumerable().GroupBy(x => x["MerkTypeID"]).Where(x => x.Count() > 1);
using (DataTable table = dtrow.CopyToDataTable())
{
}
但现在我得到了这个错误
错误 CS0311 类型
System.Linq.IGrouping<object, System.Data.DataRow>不能用作类型参数 'T' 在 泛型类型或方法DataTableExtensions.CopyToDataTable<T>(IEnumerable<T>)。没有 从System.Linq.IGrouping<object, System.Data.DataRow>到System.Data.DataRow的隐式引用转换。
那么怎么做呢?为什么它似乎在我找到此代码的链接中有效?
编辑
我尝试了亨利的这个建议:
IEnumerable<DataRow> dtrow = default(IEnumerable<DataRow>);
dtrow = (IEnumerable<DataRow>)gttDataTableOpdrachtCar.Table.AsEnumerable().GroupBy(x => x["MerkTypeID"]).Where(x => x.Count() > 1);
using (DataTable table = dtrow.CopyToDataTable())
这个编译,但在运行时我得到这个错误:
附加信息:无法转换类型的对象 'WhereEnumerableIterator
1[System.Linq.IGrouping2[System.Object,System.Data.DataRow]]' 输入 'System.Collections.Generic.IEnumerable`1[System.Data.DataRow]'。
【问题讨论】:
-
因为您执行
GroupBy它会创建分组的数据行集。您要么必须将其展平,要么选择一个元素使其工作。 -
第一个例子,如果你通过
(IEnumerable<DataRow>) dtTable.AsEnumerable()...进行转换,它会编译 -
GroupBy 得到一个二维数组 [group][DataRow[]]。可以使用 CopyToDataTable 的 datarows[] 数组。所以我认为这会起作用: dtrow.SelectMany(x => x).CopyToDataTable()
标签: c# .net winforms linq datatable