Подтвердить что ты не робот

Тип одного из выражений в предложении соединения неверен в 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
            };

Я получаю эту ошибку:

Тип одного из выражений в предложении соединения неверен. Ошибка ввода типа в вызове "Join".

QOT_SEC_ID имеет тип decimal и 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 }

но получив ошибку выше.

4b9b3361

Ответ 1

Типы и имена свойств в анонимных типах должны соответствовать:

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_ID были int?:

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

Ответ 2

В исходном запросе LINQ предложение where содержит назначение, а не сравнение (т.е. нужно "==" вместо "=" ).

Ответ 3

Я предполагаю, что один из столбцов имеет тип, который неявно конвертируется в другой. Вероятно, int и int?. Поэтому equals неявно преобразуется, а new { X = 1 } несовместим с new { X = (int?)1 }.

Переместить один из конфликтующих столбцов в int или int? в зависимости от того, возможны ли нули или нет. Например.

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

По общему признанию, ошибка компилятора в данном конкретном случае неясна и не указывает на основную причину.

(Этот ответ был спасен из удаленного дубликата. Поскольку он более полный, чем принятый в настоящее время, я добавлю его.)