web-dev-qa-db-fra.com

Le type d'une des expressions dans 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 d'une des expressions dans 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 modifier dans la table.

Quoi que je fasse, je ne suis pas en mesure de le modifier dans les propriétés du modèle ... J'ai essayé de convertir les types suivants:

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 l'erreur ci-dessus.

41
MaMu

Les types et les noms des propriétés dans les types anonymes 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 était un int?:

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

Dans la requête LINQ d'origine, la clause where contient une affectation, pas une comparaison (par exemple, besoin de "==" au lieu de "=").

2
endouglas

J'imagine que l'une des colonnes a un type implicitement convertible en une autre. Probablement, int et int?. C'est pourquoi equals convertit implicitement et new { X = 1 } est incompatible avec new { X = (int?)1 }.

Convertissez l'une des colonnes en conflit en 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 est assez floue et ne pointe pas vers la cause première.

(Cette réponse a été sauvée d'une copie supprimée. Comme elle est plus complète que celle actuellement acceptée, je l'ajouterai.)

0
usr