entity framework中的连接子句中的一个expression式的types不正确

在尝试执行此查询时:

var query = from dpr in ctx.DPR_MM join q in ctx.QOT on dpr.DPR_QOT_ID equals qot_id join p in ctx.PAY_MM on new { q.QOT_SEC_ID, dpr.DPR_TS } equals new { p.PAY_SEC_ID, p.PAY_DATE } where q.QOT_ID = qot_id select new { dpr.dpr_ts, dpr.dpr_close, pay.First().pay_dividend }; 

我得到这个错误:

join子句中的一个expression式的types不正确。 在“join”的调用中,types推断失败。

QOT_SEC_IDdecimaltypes, PAY_SEC_IDint32 。 我不能在桌上改变它。

无论我做什么,我都无法在模型的属性中改变它。 我试图转换这样的types:

 join p in ctx.PAY on new { sec_id = (Int32)(q.QOT_SEC_ID), dpr.DPR_TS } equals new { sec_id = (Int32)p.PAY_SEC_ID, p.PAY_DATE } 

但得到上面的错误。

匿名types中的属性的types名称必须匹配:

 new { p1 = q.QOT_SEC_ID, p2 = dpr.DPR_TS } equals new { p1 = (decimal)p.PAY_SEC_ID, p2 = p.PAY_DATE } 

或者如果p.PAY_SEC_ID是一个int?

 new { p1 = (int?)q.QOT_SEC_ID, p2 = dpr.DPR_TS } equals new { p1 = p.PAY_SEC_ID, p2 = p.PAY_DATE } 

在原始的LINQ查询中,where子句包含赋值,而不是比较(即需要“==”而不是“=”)。

我猜测其中一列有一种可以隐式转换为另一种的types。 可能, intint? 。 这就是为什么equals隐含地转换并且new { X = 1 }new { X = (int?)1 }不兼容的原因。

将其中一个冲突列转换为intint? 取决于是否有空值。 例如

 new { Customer_ID = (int?)pl.Customer_ID, ... } 

无可否认,在这种特殊情况下的编译器错误是相当不清楚的,并没有指出根本原因。

(这个答案是从被删除的重复中拯救出来的,因为它比目前接受的更完整,所以我会加上它。)