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

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


person MaMu    schedule 04.10.2013    source источник


Ответы (4)


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

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 }

... который не найдет совпадений PAY_SEC_ID это null или

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

... который по умолчанию от p1 до 0, когда PAY_SEC_ID равен null, и снова совпадений не будет найдено (при условии, что значения идентификатора никогда не будут 0).

person Community    schedule 04.10.2013
comment
если у нас есть один ключ как обнуляемый, а другой не обнуляемый, то не можем ли мы присоединиться к ним, выполнив некоторое преобразование? - person Badhon Jain; 07.09.2014
comment
Хорошо спасибо. Я создаю вопрос для этого. - person Hiren Desai; 27.10.2016
comment
По-видимому, вам также нужно поместить хотя бы один параметр в объект с именованными свойствами, подобными этому, если у вас есть where после вашего join. - person levininja; 20.02.2017
comment
Спасибо, я думал, что схожу с ума на мгновение - person Andrew Day; 28.06.2017
comment
В моем случае у меня был тот же тип, но одна из переменных допускала значение null: new { A = t.Hrco, B = t.Premp??0 } Я обрабатывал нулевой случай. - person Golden Lion; 07.05.2021

Надеюсь, это поможет кому-то с похожим моментом фейспалма, который только что был у меня, убедитесь, что имена свойств объекта совпадают. Ошибка отображается как:

Неверный тип одного из выражений в предложении соединения. Сбой ссылки на тип при вызове «Присоединиться»

Это немного вводит в заблуждение, поскольку это то же самое сообщение, которое появляется, когда у вас есть два разных типа значений, то есть int и double.

В моем случае это фактически означало, что сами два объекта были разными типами, а не значениями:

join count in productCount on new { tool.ItemNo, tool.ItemType } equals new { count.OrigNumber, count.ItemType }

Это генерировало следующие объекты; которые явно несопоставимы.

'a is new { int ItemNo, int ItemType }

'a is new { int OrigNumber, int ItemType }

Чтобы исправить это, просто назовите поле OrigNumber как ItemNo:

join count in productCount on new { tool.ItemNo, tool.ItemType } equals new { ItemNo = count.OrigNumber, count.ItemType }
person Simon Curtis    schedule 18.12.2019
comment
Просто добавив к вашей точке зрения @SimonCurtis, мое условие присоединения было следующим: new {od.Order_No, od.Line_No} равно new {id.order_No., id.Line_No}, и я также получал ту же ошибку. Здесь имена столбцов чувствительны к регистру. Обратите внимание, что в id.order_No прописная буква o. Исправил "о" на "о" - person Nilesh; 05.08.2020
comment
это определенно решило проблему, с которой я столкнулся, так что большое спасибо! - person DarthVegan; 13.02.2021
comment
Вы видите, что мне здесь не хватает? stackoverflow.com/questions/68304878/ Я столкнулся с аналогичной проблемой. В моем случае тип свойства и имя совпадают. Все еще получаю эту ошибку. - person Tasnim Fabiha; 08.07.2021

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

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

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

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

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

person usr    schedule 22.06.2016

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

person endouglas    schedule 21.09.2015