C# 将System.Data.EnumerableRowCollection<System.Data.DataRow> 转换为DataTable

C# Convert System.Data.EnumerableRowCollection<System.Data.DataRow> to DataTable

我有一个使用 Linq 过滤的数据表:

result = myDataTable.AsEnumerable().Where(row => row.Field<string>("id").Contains(values));

我也尝试过使用 CopyToDataTable 方法,例如

result.CopyToDataTable()

result.CopyToDataTable<DataRow>()

但是他们没有用。 如何将 result 转换为新的 DataTable? 我已经搜索了许多 Stack Overflow 问题和许多其他教程,但找不到我想要的。

更新

我已将 HashSet 连接到逗号分隔值,我认为我应该使用字符串数组或 HashSet?

我建议您创建 DataTable 的对象并通过调用 ImportRow() 函数在其中导入行,这将解决问题。

DataTable.ImportRow Method

示例代码。

DataTable tblClone = datTab.Clone();
foreach (DataRow datRow in datTab.Rows) 
{

        tblClone.ImportRow(datRow);
}

对你来说就像

var result = myDataTable.AsEnumerable().Where(row => row.Field<string>("id").Contains(values));
DataTable tblClone = myDataTable.Clone();
foreach(DataRow dr in result)
  tblClone.ImportRow(dr);

.CopyToDataTable<DataRow>() returns一个DataTable,它不会修改变量,除非你重新赋值。

result = myDataTable.AsEnumerable().Where(row => row.Field<string>("id").Contains(values));

那么您实际上需要一个 DataTable 对象。

DataTable resultDT = result.CopyToDataTable<DataRow>();

编辑:正如 Tim 所指出的,如果您的查询没有返回任何行,将抛出异常 "The source contains no DataRows"

你可以这样做;

DataTable resultDT = result.Any() ? result.CopyToDataTable<DataRow>() : myDataTable.Clone();

但这将 运行 查询两次(也正如蒂姆指出的那样)。

因此您可以使用 (.ToList()) 将其转换为列表对象,然后检查计数并进行处理。这对性能有影响,因此您创建了对象的新实例(列表对象)。

执行 try/catch 并尝试将其转换为 DataTable 也不是一个好主意。请参阅 Pranays 的回答,了解另一种实现最终结果的好方法。