使用LINQ在多个不同数据类型的列上进行Join操作

5

我有一个这样的情况:需要根据两个列连接两个表,其中一个要比较的列是可空整数,另一个是字符串(非常混乱)。在SQL中,以下内容可以正常工作:

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

现在,为了在LINQ中使用多个列进行连接,我知道必须按照以下步骤进行:

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

问题在于,我自然会得到“类型推断失败”的错误提示。很好理解,因为Column Weird在一个表中是字符串类型,在另一个表中是整型。
通常情况下,只有一个列的情况下这个问题很容易解决,可以使用ToString()或者甚至SqlFunctions.StringConvert将整型字段转换为字符串类型,如下所示:
var queryResult = (from o in T1)
join p in t2 on T1.ID equals SqlFunctions.Convert(T2.ID)

这个方法完全没问题。然而,当我尝试将两种方法结合起来时,使用以下代码会出现“无效的匿名类型成员声明”:

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

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

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)}

这告诉我对SqlFunctions函数的调用是不明确的。我有些无从下手,觉得自己一直走的路可能有点偏离正轨,而答案就在我眼前。你知道我怎么能让那个相当基本的SQL语句在LINQ中工作吗?


在调用 Convert 时尝试将 T2.Wierd 强制转换为 double。 - Steve Ruble
1个回答

12
为什么不像你提到的那样使用.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()}。
这样做应该可以解决问题。

哇,这太棒了!我在许多其他情况下都尝试过ToString(),但这次没有。我想我已经走得太远了,可能错过了什么,果然就是这样。谢谢! - KJ3
是的,有时候会发生这种情况 :) - ChemaMX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接