C# 调用多个联接条件时出错

C# 调用多个联接条件时出错,c#,linq,C#,Linq,我正在尝试使用多个条件连接多个表,但对于其中一个连接,我遇到了错误 join子句中某个表达式的类型不正确。调用“Join”时类型推断失败 from aq in auditUnitQuestions join wt in questionWt on aq.AuditQuestionWtID equals wt.AuditQuestionWtID join qt in auditQuestions on wt.AuditQuestionID equals qt.AuditQuestionID joi

我正在尝试使用多个条件连接多个表,但对于其中一个连接,我遇到了错误

join子句中某个表达式的类型不正确。调用“Join”时类型推断失败

from aq in auditUnitQuestions
join wt in questionWt on aq.AuditQuestionWtID equals wt.AuditQuestionWtID
join qt in auditQuestions on wt.AuditQuestionID equals qt.AuditQuestionID
join ac in AuditComponents on qt.ComponentID equals ac.ComponentID
join kra in AuditKRAs on new { ac.ComponentID, qt.KRAID } equals new { kra.ComponentID, kra.KRAID }
//below I am getting error (The type of one of the expressions in the join clause 
//is incorrect. Type inference failed in the call to 'Join'.
join prm in auditParameters on new { kra.KRAID, qt.AuditParametersID } equals new { prm.AuditKRAID, prm.AuditingParametersID }
where aq.Unitcode == calendar.UnitCode
&& wt.AuditTypeID == auditType
&& qt.Isactive == "Y"

我认为问题在于相等条件必须命名或具有相同的名称,这就是为什么必须用以下内容替换有问题的行:

    join prm in auditParameters on 
      new { KRAID = kra.KRAID, AuditID  = qt.AuditParametersID } 
    equals 
      new { KRAID = prm.AuditKRAID, AuditID = prm.AuditingParametersID }

问题是您正在连接两个以上的匿名类型,但这些类型不兼容-属性名称不同。您必须有一个单一的键类型,因此
equals
的两边基本上必须是相同的类型

与此相反:

new { kra.KRAID, qt.AuditParametersID }
equals new { prm.AuditKRAID, prm.AuditingParametersID }
您应该有如下内容:

new { kra.KRAID, qt.AuditParametersID }
equals new { KRAID = prm.AuditKRAID, AuditParametersID = prm.AuditingParametersID }
或者,您可以为这两种匿名类型显式指定相同的名称:

new { x = kra.KRAID, y = qt.AuditParametersID }
equals new { x = prm.AuditKRAID, y = prm.AuditingParametersID }

当然,
kra.KRAID
的类型必须与
prm.AuditKRAID
的类型相同,同样地,
qt.AuditParametersID
的类型必须与
prm.AuditingParametersID
的类型相同,否则匿名类型仍然不匹配。

您加入的相等条件不能有匿名类型,您必须命名参数:

join prm in auditParameters on new 
{ 
    kraID = kra.KRAID, auditParameterID = qt.AuditParametersID 
} 
equals new 
{ 
    kraID = prm.AuditKRAID, auditParameterID  = prm.AuditingParametersID 
}

此外,参数的类型必须相同
kra.KRAID
必须具有与
prm.AuditKRAID

相同的类型,并且您是否尝试过将其减少到失败的最短查询?例如,去掉
aq
wt
ac
部分,因为它们不是失败连接的一部分。。。以及
where
子句。