Le type de l'une des expressions de la clause join est incorrect dans Entity Framework
En essayant d'exécuter cette requête:
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
};
Je reçois cette erreur:
Le type de l'une des expressions de la clause join est incorrect. L'inférence de Type a échoué dans l'appel à "Rejoindre".
QOT_SEC_ID
est de type decimal
et PAY_SEC_ID
est de type int32
.
Je ne suis pas autorisé à le changer dans le tableau.
Peu importe ce que je fais, Je ne suis pas capable de le changer dans les propriétés du modèle. J'ai essayé de convertir les types comme ceci:
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 }
Mais obtenir le l'erreur ci-dessus.
3 réponses
Les types de et, les noms des propriétés dans l'anonymat types doivent correspondre:
new { p1 = q.QOT_SEC_ID, p2 = dpr.DPR_TS }
equals
new { p1 = (decimal)p.PAY_SEC_ID, p2 = p.PAY_DATE }
, Ou si p.PAY_SEC_ID
ont été un int?
:
new { p1 = (int?)q.QOT_SEC_ID, p2 = dpr.DPR_TS }
equals
new { p1 = p.PAY_SEC_ID, p2 = p.PAY_DATE }
Dans la requête LINQ d'origine, la clause where contient une affectation, pas une comparaison (c'est-à-dire besoin de "==" Au lieu de "=").
Je suppose que l'une des colonnes a un type qui est implicitement convertible à l'autre. Probablement, int
et int?
. C'est pourquoi equals
convertit implicitement et new { X = 1 }
est incompatible avec new { X = (int?)1 }
.
Jeter un conflit colonnes de int
ou int?
selon que les valeurs null sont possibles ou non. Par exemple
new { Customer_ID = (int?)pl.Customer_ID, ... }
Certes, L'erreur du compilateur dans ce cas particulier n'est pas claire et ne pointe pas vers la cause première.
(Cette réponse a été sauvée d'un supprimé dupliquer. Comme il est plus complet que celui actuellement accepté, je vais l'ajouter.)