【问题标题】:How to get the result of a `linq` back to a DataTable?如何将`linq`的结果返回到DataTable?
【发布时间】: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&lt;System.Linq.IGrouping&lt;object, System.Data.DataRow&gt;&gt;System.Collections.Generic.IEnumerable&lt;System.Data.DataRow&gt;。一个 存在显式转换(您是否缺少演员表?)

我也这样尝试过

var dtrow = dtTable.AsEnumerable().GroupBy(x => x["MerkTypeID"]).Where(x => x.Count() > 1);
using (DataTable table = dtrow.CopyToDataTable())
{

}

但现在我得到了这个错误

错误 CS0311 类型 System.Linq.IGrouping&lt;object, System.Data.DataRow&gt; 不能用作类型参数 'T' 在 泛型类型或方法 DataTableExtensions.CopyToDataTable&lt;T&gt;(IEnumerable&lt;T&gt;)。没有 从System.Linq.IGrouping&lt;object, System.Data.DataRow&gt;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())

这个编译,但在运行时我得到这个错误:

附加信息:无法转换类型的对象 'WhereEnumerableIterator1[System.Linq.IGrouping2[System.Object,System.Data.DataRow]]' 输入 'System.Collections.Generic.IEnumerable`1[System.Data.DataRow]'。

【问题讨论】:

  • 因为您执行GroupBy 它会创建分组的数据行集。您要么必须将其展平,要么选择一个元素使其工作。
  • 第一个例子,如果你通过(IEnumerable&lt;DataRow&gt;) dtTable.AsEnumerable()...进行转换,它会编译
  • GroupBy 得到一个二维数组 [group][DataRow[]]。可以使用 CopyToDataTable 的 datarows[] 数组。所以我认为这会起作用: dtrow.SelectMany(x => x).CopyToDataTable()

标签: c# .net winforms linq datatable


【解决方案1】:

您可以使用以下代码:

var result = dtTable.AsEnumerable().GroupBy(x => x["MerkTypeID"])
    .Where(x => x.Count() > 1)
    .SelectMany(x => x.ToList())
    .CopyToDataTable();

如果您按MerkTypeID 对行进行分组,它将返回具有多个成员的组的所有行。

【讨论】:

    【解决方案2】:

    您的类型不匹配。这就是编译器告诉你的。当您执行 .GroupBy 子句时,它会创建一组组,据我所知,您需要平面的 DataRows 集合。

    您需要摆脱 .GroupBy 子句,或将您的组集合转换为平面列表。现在,您有一组组,每个组对应一个“MerkTypeID”,每个组都包含具有该 MerkTypeID 值的所有记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多