linq语句中的连接

时间:2013-12-19 16:36:14

标签: c# linq

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是第一个数据库中的不同列,有什么想法吗?

3 个答案:

答案 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
                      };