wake-up-neo.com

Der Typ eines der Ausdrücke in der Join-Klausel ist in Entity Framework falsch

Beim Versuch, diese Abfrage auszuführen: 

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

Ich erhalte diesen Fehler:

Der Typ eines der Ausdrücke in der Join-Klausel ist falsch . Die Typeninferenz ist beim Aufruf von 'Join' fehlgeschlagen.

QOT_SEC_ID ist vom Typ decimal und PAY_SEC_ID ist vom Typ int32. Ich darf es nicht in der Tabelle ändern.

Egal was ich mache, ich kann es nicht in den Eigenschaften des Modells ändern. Ich habe versucht, die Typen so zu konvertieren:

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 }

aber den Fehler oben bekommen.

41
MaMu

Die Typen und die Namen der Eigenschaften in den anonymen Typen müssen übereinstimmen:

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

oder wenn p.PAY_SEC_ID ein int? wäre:

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

In der ursprünglichen LINQ-Abfrage enthält die where-Klausel eine Zuordnung, nicht einen Vergleich (d. H. "==" anstelle von "=").

2
endouglas

Ich vermute, dass eine der Spalten einen Typ hat, der implizit in die andere konvertierbar ist. Wahrscheinlich int und int?. Deshalb konvertiert equals implizit und new { X = 1 } ist mit new { X = (int?)1 } nicht kompatibel.

Wandeln Sie eine der in Konflikt stehenden Spalten in int oder int? um, je nachdem, ob Nullen möglich sind oder nicht. Z.B.

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

Zwar ist der Compiler-Fehler in diesem speziellen Fall ziemlich unklar und deutet nicht auf die Hauptursache hin.

(Diese Antwort wurde aus einem gelöschten Duplikat gerettet. Da sie vollständiger ist als die derzeit akzeptierte, füge ich sie hinzu.)

0
usr