我有一个使用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数组?
答案 0 :(得分:3)
我建议您通过调用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);
答案 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的答案,了解实现最终结果的另一种好方法。