【问题标题】:LINQ (Unable to cast object of type 'System.Double' to type 'System.String'.)LINQ(无法将“System.Double”类型的对象转换为“System.String”类型。)
【发布时间】:2013-04-22 07:48:29
【问题描述】:

我在使用 LINQ 概念时遇到问题。 下面我比较两个数据表,一个由数据库填充,另一个由 excel 文件填充。

问题是当我在两个“tempdt”之间应用连接时包含双值,这会导致转换对象的错误。 我无法将返回类型从字符串更改为双精度,因为它将来可能是任何数据类型,因为目前它是双精度的,将来可能是字母数字。

    var commonRows = from r1 in dt.AsEnumerable()
                             join r2 in tempdt.AsEnumerable()
                             on r1.Field<string>(0) equals r2.Field<string>(4)
                             select r2;
            if (commonRows.Any())
            {
                abcdefgh = commonRows.Count();
                dt123 = commonRows.CopyToDataTable();
                // ring the ghanta of gutlu
            }

异常:无法将“System.Double”类型的对象转换为类型 'System.String'。

【问题讨论】:

标签: c# .net linq


【解决方案1】:

这是我认为您的问题所在:

from r1 in dt.AsEnumerable()
join r2 in tempdt.AsEnumerable() on
r1.Field<string>(0)  //<-- this may not be string
equals 
r2.Field<string>(4) //<-- this may not be string
select r2;

可以做的就是把它当作对象:

from r1 in dt.AsEnumerable()
join r2 in tempdt.AsEnumerable() on
(string.Empty + r1.Field<object>(0)) <-- Edited by Andreas X
equals 
(string.Empty + r2.Field<object>(4)) <-- Edited by Andreas X
select r2;

应该做的是确保您的索引号(0 和 4)指向相同的类型。

编辑:当询问 tostring 值时,我通常使用旧的 ASP 技巧来避免空指针。

【讨论】:

  • 在使用你的概念时,我遇到了错误对象引用未设置为对象的实例。
  • 错误是对象引用未设置为对象的实例。
  • 我不能使它们具有相同的类型,因为 r2.Field(4).ToString() 以我正在转换为数据表的 excel 形式来自用户端。
  • 好的 - 我只是假设这两个数据表来自您自己的数据库:)
【解决方案2】:

转换为字符串实际上是不可能的,因为 double 和 string 是 2 个完全不相关的类。也许尝试比较他们的 .ToString() 值。或者,如果您想完全安全,请比较它们的字符串格式,这样您就不会得到任何 NullReferenceExceptions:string.Format("{0}", fieldvalue)

【讨论】:

    【解决方案3】:

    下面的代码对我有用。

    谢谢大家

        var commonRows = from r1 in dt.AsEnumerable()
                                 join r2 in tempdt.AsEnumerable()
                                 //on r1.Field<object>(0).ToString() equals r2.Field<object>(4).ToString()
                                 on r1[0].ToString() equals r2[4].ToString()
                                 select r2;
                if (commonRows.Any())
                {
                    abcdefgh = commonRows.Count();
                    dt123 = commonRows.CopyToDataTable();
                    // ring the ghanta of gutlu
                }
    

    【讨论】:

    • 除了这是一种比较双打的可怕方式,这似乎是你在这里做的......
    • @jeroenh :这里没有人比较双打。我把这个方法用来比较两个数据表。
    • @jeroenh :或者如果你在谈论我将其转换为字符串的方式,那么可能是 [string.Format("{0}", r1[0])] 这种方式适合你吗?
    【解决方案4】:

    Field 期望底层数据类型是字符串。

    见:http://msdn.microsoft.com/en-us/library/bb301394.aspx

    InvalidCastException
    基础列的值类型无法转换为泛型参数 T 指定的类型。

    您可以使用 object 来忽略 Jens Kloster 想要的类型。 但是,如果您不知道列的数据类型,那么您的设计就有问题。

    【讨论】:

    • 我怎样才能知道用户在他的 excel 文件中给出了哪种类型的值。他可以给出小数值,也可以只给出整数或字母数字。
    • 1.用户不会一直这样做。 2. 从我的角度来看,我尝试了它,但它仍然给出相同的错误,因为 uts 值保持不变,只是当我们在电子表格中进行格式化时它的可视化发生了变化。
    【解决方案5】:

    此错误是由属性的实体和基础表列之间的数据类型不匹配引起的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多