【发布时间】:2018-03-15 19:55:38
【问题描述】:
我正在尝试从 DataTable 中提取特定的错误行:
在 SQL 中这是我的想法:
SELECT
*
FROM [Main].[tableData] AS [D]
WHERE [D].[Row Number] IN (
-- List<int> errorLineNumbers Here
)
这是我的 C#:
DataTable mainDataTable = GetData();
List<int> errorLineNumbers errorLineNumbers = GerErrorLineNumbers(mainDataTable);
// This Crashes
DataTable errorDataTable = (from main in mainDataTable.AsEnumerable()
where main.Field<int>("Row Number").Equals(errorLineNumbers)
select main).CopyToDataTable<DataRow>();
这是异常:InvalidCastException
指定的转换无效。
我对此没有太多经验。任何帮助将不胜感激。
【问题讨论】:
-
在c#中你最好不要直接处理
DataTable。将您的数据表示为一个类,您可以对该类的集合执行 LINQ 查询。使用DataTable和DataRow涉及大量繁琐的空检查和强制转换。 -
where errorLineNumbers.Contains(main.Field<int>("Row Number")) -
我想在多个不同的数据表上运行这段代码。如果我要在课堂上表示我的数据。我必须创建多个与每个表匹配的不同类/模型,或者求助于一些动态类创建;我宁愿避免。
-
@mjwills 是的,当我尝试了您的评论时;我意识到我的数据表中的“行号”列是字符串类型。当我将其更改为 int 并尝试您的代码时。它工作得很好。非常感谢您的帮助。将其发布为答案,以便我标记它。
-
Linq IN Operator的可能重复