【问题标题】:linq query getting Unable to cast object of type 'System.Boolean' to type 'System.String'linq 查询无法将“System.Boolean”类型的对象转换为“System.String”类型
【发布时间】:2017-06-14 21:30:20
【问题描述】:

我的问题在于 Where 子句 table1.Field<string>(3) == table2.Field<string>(3)。这些值是 0 或 1,我认为 linq 将其更改为 bool 值。 Linq 得到“无法将 'System.Boolean' 类型的对象转换为 'System.String' 类型”。

我试过table1[3].ToString() == table2[3].ToString(),但它没有出现错误或匹配的行,我知道它应该会出现一些。

我的查询:

var match = (from table1 in dt1.AsEnumerable()
                     join table2 in dt2.AsEnumerable() on table1[1].ToString() equals table2[1].ToString())
                     where table1.Field<string>(3) == table2.Field<string>(3)
                     && table1.Field<string>("ID") == table2.Field<string>("ID")
                     select table1).ToList();

我希望在该行上添加更多 where 子句,但对于要比较的值为 0 或 1 的子句会失败。

感谢您的帮助

【问题讨论】:

  • 如果您删除该条件,您的结果中是否有记录?
  • 你试过String.Equal()的方法吗?
  • @Hackerman 是的。我什至可以添加其他不具有 0 或 1 值的 Where 子句并且它可以工作
  • @Media 是的,同样的问题

标签: c# linq


【解决方案1】:

所以看起来根本问题是table1[3]System.Stringtable2[3]System.Boolean。所以演员在table2.Field&lt;string&gt;(3)上失败了。

所以用适当的测试替换你的where

where (table1.Field<string>(3) == "1") == table2.Field<bool>(3)

【讨论】:

  • 我使用字符串的原因是因为Datatable中的值不是bool值,而是更多的int;但是,我将添加的一些 where 子句的值将是 0、1、A、B。所以我希望我可以使用
  • 我认为您需要找出dt1.Rows[0][3] 的类型——Field 必须匹配。
  • 我收到“指定的演员表无效”。当使用table1.Field&lt;bool&gt;(3) == table2.Field&lt;bool&gt;(3)
  • 我想我会去掉一个 Where 子句并在末尾添加select table1[3].GetType()。它甚至以 System.String 的形式返回。所以我迷路了
  • 我又改了答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2012-09-07
  • 1970-01-01
  • 2014-03-14
  • 2017-11-24
相关资源
最近更新 更多