【问题标题】:How to run Linq on DataTable with SQL like 'IN' and return DataTable C#?如何使用“IN”之类的 SQL 在 DataTable 上运行 Linq 并返回 DataTable C#?
【发布时间】: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 查询。使用DataTableDataRow 涉及大量繁琐的空检查和强制转换。
  • where errorLineNumbers.Contains(main.Field&lt;int&gt;("Row Number"))
  • 我想在多个不同的数据表上运行这段代码。如果我要在课堂上表示我的数据。我必须创建多个与每个表匹配的不同类/模型,或者求助于一些动态类创建;我宁愿避免。
  • @mjwills 是的,当我尝试了您的评论时;我意识到我的数据表中的“行号”列是字符串类型。当我将其更改为 int 并尝试您的代码时。它工作得很好。非常感谢您的帮助。将其发布为答案,以便我标记它。
  • Linq IN Operator的可能重复

标签: c# wpf linq


【解决方案1】:

where 子句中,您试图将 int(字段值)与 List&lt;int&gt; 对象相等 - 自然会尝试强制转换然后失败。相反,请尝试以下方法:

DataTable errorDataTable = (from main in mainDataTable.AsEnumerable()
                            where errorLineNumbers.Contains(main.Field<int>("Row Number"))
                            select main).CopyToDataTable<DataRow>();

【讨论】:

  • :) 感谢您的帮助。 @mjwills 也发表了同样的评论。另外:我意识到我的数据表中的“行号”列是字符串类型。所以我把它改成了 int ,它工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多