LINQ加入具有不同数据类型的多列

KJ3*_*KJ3 5 c# sql linq

我有一种情况,我需要基于两列连接两个表,其中一个要比较的列是一个可以为空的整数,而一个是一个字符串(我知道这是一个很大的混乱).在SQL中,以下工作原理:

 SELECT stuff
 FROM Table1 t1
 Inner Join Table2 t2 on t1.ID = t2.ID and t2.Weird = CAST(t1.Weird AS varchar(11))
Run Code Online (Sandbox Code Playgroud)

现在为了在LINQ中连接多个列,我知道我必须执行以下操作:

var queryResult = (from o in T1)
join p in t2 on new { T1.ID, T1.Weird} equals new {T2.ID, T2.Weird}
Run Code Online (Sandbox Code Playgroud)

问题是,我自然会得到"类型推断失败"错误.有道理,Column Weird是一个表中的字符串,另一个表中是int.

现在通常只有一列这将是一个简单的修复,只需执行ToString()甚至SqlFunctions.StringConvert整数字段,如下所示:

var queryResult = (from o in T1)
join p in t2 on T1.ID equals SqlFunctions.Convert(T2.ID)
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,当我尝试将这两种方法结合起来时,我得到了一个"无效的匿名类型成员声明符",其中包含以下内容:

var queryResult = (from o in T1)
join p in t2 on new { T1.ID, T1.Weird} equals new {T2.ID, SqlFunctions.Convert( T2.Weird)}
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我发现我需要命名这些值,所以我尝试了以下方法:

var queryResult = (from o in T1)
join p in t2 on new {ID = T1.ID, Weird = T1.Weird} equals new {ID = T2.ID, Weird = SqlFunctions.Convert(T2.Weird)}
Run Code Online (Sandbox Code Playgroud)

这告诉我对SqlFunctions函数的调用是不明确的.我有点没有想到,并且认为当我的答案出现在我面前时,我可能会走得很远.知道如何在LINQ中使用相当基本的SQL语句吗?

小智 11

为什么不像你提到的那样使用.ToString():


var queryResult = 
from o in T1 
join p in T2 
   on new {ID = T1.ID, Weird = T1.Weird} equals new {ID = T2.ID, Weird = T2.Weird.ToString()}

这应该够了吧.