Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq语句中的串联_C#_Linq - Fatal编程技术网

C# linq语句中的串联

C# linq语句中的串联,c#,linq,C#,Linq,获取错误: 指定的强制转换在((字符串)(表1[“ANo”])+测试+(字符串)表1[“MNo”])等于(字符串)表2[“文件代码”]时无效 因此,在我的linq中,我试图将一个数据库中的ANo/MNo与另一个数据库中的File\u code进行匹配,其中ANo&MNo是第一个数据库中的不同列,有什么想法吗?(string)(表1[“ANo”])实际上是对.NET中转换函数的调用,并且底层存储引擎中没有相应的函数。因此,当LINQ提供程序即将以特定于存储的表达式树的形式实现查询时,操作失败,因为

获取错误:

指定的强制转换在((字符串)(表1[“ANo”])+测试+(字符串)表1[“MNo”])等于(字符串)表2[“文件代码”]时无效

因此,在我的linq中,我试图将一个数据库中的
ANo
/
MNo
与另一个数据库中的
File\u code
进行匹配,其中
ANo
&
MNo
是第一个数据库中的不同列,有什么想法吗?

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

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

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

(字符串)(表1[“ANo”])实际上是对.NET中转换函数的调用,而底层存储引擎中没有相应的函数。因此,当LINQ provider即将以特定于存储的表达式树的形式实现查询时,操作失败,因为LINQ provider无法找到要使用的适当函数

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


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

如果您有这样的代码

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"]
              };
您只是将
a
的编译时类型从
object
更改为
string
,这称为强制转换。这仅适用于
a
已经是字符串(实际类型)。如果

object a = "1";
var a2 = (string)a;
您遇到运行时异常(
InvalidCastException
),因为整数不能充当(强制转换为)字符串。这就是代码中发生的情况。您尝试强制转换为字符串的对象中至少有一个实际上不是字符串


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

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"]
              };
object a = 1;
var a2 = (string)a;
您只是将
a
的编译时类型从
object
更改为
string
,这称为强制转换。这仅适用于
a
已经是字符串(实际类型)。如果

object a = "1";
var a2 = (string)a;
您遇到运行时异常(
InvalidCastException
),因为整数不能充当(强制转换为)字符串。这就是代码中发生的情况。您尝试强制转换为字符串的对象中至少有一个实际上不是字符串


解决方法很简单:使用
ToString()
。这会将对象转换为字符串。转换会转换对象的实际类型。

ANo、MNo和File\u代码都是字符串字段吗?任何字段都可以为空吗?在
data1
data2
中有什么内容?这对于回答以下问题可能非常重要:)注意,您必须使用
.ToString()
而不是
(string)
如果数据实际上不是一个字符串,而是一个数字,例如,
(string)
执行强制转换,而
.ToString()
执行转换,这两件事截然不同。data2是access数据库中的一个表,而data1来自mssql数据库。@Luaan我现在只看到你的评论了(在回答我自己之后)。如果你转换:)我认为这是一个应该被接受的答案。@GertArnold我喜欢你的答案,它简单明了。没有理由再添加一个我的答案;)ANo、MNo和File_代码都是字符串字段吗?任何字段都可以为空吗?在data1data2中有什么内容?这对于回答这个问题可能非常重要stion:)请注意,如果数据实际上不是字符串,而是数字,则必须使用
.ToString()
而不是
(字符串)
,例如。
(字符串)
.ToString()时进行强制转换(如果可能)
进行转换,这两件事截然不同。data2是access数据库中的一个表,而data1来自mssql数据库。@Luaan我现在只看到你的评论(在回答我自己的问题后)。如果你把:)转换成一个答案,我想应该会被接受。@GertArnold我喜欢你的答案,它简单明了。没有理由再添加我的答案;)这两个
.AsEnumerable()
调用在纯linq to objects的情况下会发生这种情况。请注意-将数据表转换为可枚举的意味着在按联接条件进行剪切之前将交叉联接带到内存中。结果应转换为对象(然后再转换为linq to objects)只有在存储尽了最大努力后,才能构造出真正需要的最少记录调用在纯linq to objects的情况下会发生这种情况。请注意-将数据表转换为可枚举的意味着在按联接条件进行剪切之前将交叉联接带到内存中。结果应转换为对象(然后再转换为linq to objects)只有在存储尽了最大努力来构造真正需要的最少记录之后。现在我的下一个挑战是如何将此IEnum转换为datatable数据行数组。现在我的下一个挑战是如何将此IEnum转换为datatable数据行数组。
object a = 1;
var a2 = (string)a;