我有一个这样的情况:需要根据两个列连接两个表,其中一个要比较的列是可空整数,另一个是字符串(非常混乱)。在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中工作吗?