web-dev-qa-db-ja.com

結合句の式の1つの型がEntity Frameworkで正しくありません

このクエリを実行しようとしている間:

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

私はこのエラーを受け取っています:

結合句の式のいずれかのタイプが正しくありません。 「推論」の呼び出しで型推論が失敗しました。

QOT_SEC_IDdecimalおよびPAY_SEC_IDはタイプint32。テーブルで変更することはできません。

何をしても、モデルのプロパティを変更することはできません。私はこのようなタイプを変換しようとしました:

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 }

しかし、上記のエラーが発生します。

48
MaMu

タイプand匿名タイプのプロパティの名前は一致する必要があります。

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

またはp.PAY_SEC_IDint?

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

列の1つが暗黙的に他の列に変換可能な型を持っていると推測しています。おそらく、intおよび_int?_。 equalsが暗黙的に変換し、_new { X = 1 }_がnew { X = (int?)1 }と互換性がないのはそのためです。

NULLが可能かどうかに応じて、競合する列の1つをintまたは_int?_にキャストします。例えば。

_new { Customer_ID = (int?)pl.Customer_ID, ... }
_

確かに、この特定の場合のコンパイラエラーは非常に不明確であり、根本的な原因を示していません。

(この答えは、削除された複製から救われました。現在受け入れられているものよりも完全なので、追加します。)

2
usr

元のLINQクエリでは、where句に比較ではなく割り当てが含まれています(つまり、「=」ではなく「==」が必要です)。

2
endouglas