Durante il tentativo di eseguire questa query:
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 };
Sto ottenendo questo errore:
Il tipo di una delle espressioni nella clausola join non è corretto. Digitare l’inferenza non riuscita nella chiamata a “Partecipa”.
QOT_SEC_ID
è di tipo decimal
e PAY_SEC_ID
è di tipo int32
. Non ho il permesso di cambiarlo sul tavolo.
Non importa cosa faccio, non sono in grado di cambiarlo nelle proprietà del modello. Ho provato a convertire i tipi in questo modo:
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 }
ma ottenendo l’errore sopra.
I tipi e i nomi delle proprietà nei tipi anonimi devono corrispondere:
new { p1 = q.QOT_SEC_ID, p2 = dpr.DPR_TS } equals new { p1 = (decimal)p.PAY_SEC_ID, p2 = p.PAY_DATE }
o se p.PAY_SEC_ID
erano un int?
:
new { p1 = (int?)q.QOT_SEC_ID, p2 = dpr.DPR_TS } equals new { p1 = p.PAY_SEC_ID, p2 = p.PAY_DATE }
Nella query LINQ originale, la clausola where contiene l’assegnazione, non il confronto (ad esempio, è necessario “==” anziché “=”).
Suppongo che una delle colonne abbia un tipo che è implicitamente convertibile nell’altra. Probabilmente, int
e int?
. Ecco perché equals
conversioni implicite e new { X = 1 }
è incompatibile con new { X = (int?)1 }
.
Trasmetti una delle colonne in conflitto a int
o int?
a seconda che i valori nulli siano possibili o meno. Per esempio
new { Customer_ID = (int?)pl.Customer_ID, ... }
Certo, l’errore del compilatore in questo caso particolare non è chiaro e non punta alla causa principale.
(Questa risposta è stata salvata da un duplicato eliminato. Poiché è più completa di quella attualmente accettata, la aggiungerò.)