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 是一个表中的字符串和另一个表中的 int。

现在通常只有一列,这将是一个简单的修复,只需执行 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 函数的调用不明确。我有点想不通,我想当答案就在我面前时,我可能会走得很远。知道如何在 LINQ 中使这个相当基本的 SQL 语句工作吗?

4

1 回答 1

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

这应该够了吧。

于 2013-10-04T23:02:46.713 回答