C#将System.Data.EnumerableRowCollection <system.data.datarow>转换为DataTable

时间:2017-11-28 10:39:44

标签: c# ienumerable

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

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

我也尝试过使用像

这样的CopyToDataTable方法
result.CopyToDataTable()

result.CopyToDataTable<DataRow>()

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

更新

我已将HashSet连接到逗号分隔值,我想我应该使用String或HashSet数组?

2 个答案:

答案 0 :(得分:3)

我建议您通过调用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);

答案 1 :(得分:1)

.CopyToDataTable<DataRow>()返回一个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();

但是这将运行两次查询(同时Tim指出)。

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

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