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"]
};
收到错误:
指定的强制转换在((string)(table1 [“ANo”])+ test +(string)table1 [“MNo”])equals(string)table2 [“File_Code”]上无效。
因此,在我的linq中,我尝试将一个数据库中的ANo
/ MNo
与另一个数据库中的File_Code
进行匹配ANo
& MNo
是第一个数据库中的不同列,有什么想法吗?
答案 0 :(得分:2)
(string)(table1 [“ANo”])实际上是对.NET中转换函数的调用,底层存储引擎中没有相应的函数。因此,当LINQ提供程序即将以特定存储特定表达式树的形式实现查询时,操作将失败,因为LINQ提供程序无法找到要使用的适当函数。
如果诸如ANo之类的项目不是字符串(例如varchar或类似的东西),那么您可能需要调用特定提供程序的方法,例如SqlFunctions.StringConvert(table1 [“ANo”)。
LINQ提供程序无法转换.NET代码的典型示例是日期/时间函数(例如DateTime.AddSeconds等)。
答案 1 :(得分:2)
当你有像
这样的代码时object a = "1";
var a2 = (string)a;
您只是将a
的编译时类型从object
更改为string
,这称为强制转换。这只能起作用,因为a
已经 一个字符串(实际类型)。如果你这样做
object a = 1;
var a2 = (string)a;
您遇到运行时异常(InvalidCastException
),因为整数不能充当(强制转换)string
。这就是你的代码中发生的事情。您尝试强制转换为字符串的对象中至少有一个实际上不是字符串。
补救措施很简单:使用ToString()
。此将对象转换为字符串。转换会转换对象的实际类型。
答案 2 :(得分: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
};