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.

35
demandé sur abatishchev 2013-10-04 18:38:25

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 }
96
répondu Gert Arnold 2015-08-18 20:18:31

Dans la requête LINQ d'origine, la clause where contient une affectation, pas une comparaison (c'est-à-dire besoin de "==" Au lieu de "=").

2
répondu endouglas 2015-09-21 22:00:07

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.)

0
répondu usr 2016-06-22 20:25:16