El tipo de una de las expresiones en la cláusula join es incorrecto en Entity Framework

Al intentar ejecutar esta consulta:

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

Me aparece este error:

El tipo de una de las expresiones en la cláusula join es incorrecto. La inferencia de tipo falló en la llamada a ‘Unirse’.

QOT_SEC_ID es de tipo decimal y PAY_SEC_ID es de tipo int32 . No puedo cambiarlo en la tabla.

No importa lo que haga, no puedo cambiarlo en las propiedades del modelo. He intentado convertir los tipos como este:

 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 } 

pero obteniendo el error anterior

Los tipos y los nombres de las propiedades en los tipos anónimos deben coincidir:

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

o si p.PAY_SEC_ID fuera un int? :

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

En la consulta LINQ original, la cláusula where contiene asignación, no comparación (es decir, necesita “==” en lugar de “=”).

Supongo que una de las columnas tiene un tipo que es implícitamente convertible a la otra. Probable, int y int? . Es por eso que equals convierte implícitamente y el new { X = 1 } es incompatible con el new { X = (int?)1 } .

¿Lanza una de las columnas conflictivas a int o int? dependiendo de si los nulos son posibles o no. P.ej

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

Es cierto que el error del comstackdor en este caso particular no está del todo claro y no apunta a la causa raíz.

(Esta respuesta fue rescatada de un duplicado eliminado. Como es más completa que la actualmente aceptada, la agregaré).