1

我在使用 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”类型。

4

5 回答 5

6

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

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 技巧来避免空指针。

于 2013-04-22T07:58:16.293 回答
2

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

于 2013-04-22T07:53:35.990 回答
1

下面的代码对我有用。

谢谢大家

    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
            }
于 2013-04-22T08:19:57.717 回答
0

Field 期望基础数据类型是字符串。

请参阅:http: //msdn.microsoft.com/en-us/library/bb301394.aspx

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

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

于 2013-04-22T08:23:12.183 回答
0

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

于 2020-12-17T22:06:23.043 回答