2013-12-19 41 views
2
string test = "/"; 
var results = from table1 in data2.AsEnumerable() 
       join table2 in data1.AsEnumerable() 
       on ((string)(table1["ANo"]) + test + (string)table1["MNo"]) equals (string)table2["File_Code"] 
       where (float)table1["c1"] != 0 
       && (string)table1["Case_Status"] == "Open" 
       select new 
       { 
        ACode = (int)table1["ACode"], 
        ANo = (int)table1["ANo"], 
        c1 = (int)table1["c1"] 
       }; 

得到一个错误:串联在LINQ声明

Specified Cast is invalid on ((string)(table1["ANo"]) + test + (string)table1["MNo"]) equals (string)table2["File_Code"].

所以在我的LINQ我试图在一个数据库匹配ANo/MNo到另一个File_Code其中ANo & MNo不同列中第一个数据库,任何想法?

+0

ANo,MNo和File_Code都是字符串字段吗?而且可能是空的? – Jonny

+0

'data1'和'data2'是什么?这可能对于回答这个问题很重要:)注意,如果数据实际上不是字符串,而是数字,例如,您必须使用'.ToString()'而不是'(字符串)'。如果可能,'(String)'会进行转换,而'.ToString()'进行转换时,两种截然不同的东西。 – Luaan

+0

data2是访问数据库中的表,而data1来自mssql数据库。 – Arantuath

回答

0
var results1 = from table1 in data2.AsEnumerable() 
         select new 
         { 
          A_M = table1["ANo"] + "\" + table1["MatterNo"], 
          ANo = table1["ANo"], 
          c1 = table1["c1"].Equals(DBNull.Value) ? 0 : Convert.ToInt32(table1["c1"]), 
          //Case_Status = Convert.ToString(table1["Case_ Status"]) 
         }; 
     var results = from table1 in results1 
         join table2 in data1.AsEnumerable() 
         on table1.A_M equals (string)table2["File_Code"] 
         where table1.c1 != 0 
         && (string)table2["Case_Status"] == "Open" 
         orderby table1.ANo 
         select new 
         { 
          cCode = table2["acAccountCode"], 
          ANo = table1.ANo, 
          c1 = table1.c1 
         }; 
+0

现在我的下一个挑战就是将这个IEnum转换为可数据的数据行数组。 – Arantuath

2

(string)(table1 [“ANo”])实际上是对.NET中的转换函数的调用,并且底层存储引擎中没有对应的函数。因此,当LINQ提供程序要以特定存储特定表达式树的形式实现查询时,操作失败,因为LINQ提供程序找不到要使用的适当函数。

如果ANo等项目不是字符串(例如varchar或类似的东西),那么您可能需要调用特定提供者的方法,例如SqlFunctions.StringConvert(table1 [“ANo”)。

.NET代码无法由LINQ提供程序转换的典型示例是日期/时间函数(例如DateTime.AddSeconds等)。

+1

这两个'.AsEnumerable()'调用将它转换为纯粹的linq-to-objects情况。 –

+0

要谨慎 - 将数据表转换为可枚举表示在通过连接条件切割它们之前将交叉连接带入内存。结果应该被转换为对象(之后才会被转换为对象),只有在存储完成了最好的工作之后,才能构建真正需要的记录的最小值。 –

2

当你有这样的代码

object a = "1"; 
var a2 = (string)a; 

你只能从object改变a编译时类型string,这就是所谓的铸造。这只适用于因为a已经一个字符串(实际类型)。如果你

object a = 1; 
var a2 = (string)a; 

你碰上一个运行时异常(InvalidCastException),因为整数不能为(转换成)一个string行动。这就是你的代码中发生的事情。至少有一个你试图转换为字符串的对象实际上并不是一个字符串。

补救措施很简单:使用ToString()。这对象转换为字符串。转换将转换实际的类型的对象。