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 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 的回答,了解另一种实现最终结果的好方法。
我有一个使用 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 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 的回答,了解另一种实现最终结果的好方法。