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.
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 }
In der ursprünglichen LINQ-Abfrage enthält die where-Klausel eine Zuordnung, nicht einen Vergleich (d. H. "==" anstelle von "=").
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.)