联接子句中的一个表达式的类型在实体框架中是不正确的

在尝试执行此查询时:

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 子句中的一个表达式的类型不正确。 调用“ Join”时类型推断失败。

QOT_SEC_IDdecimal型,PAY_SEC_IDint32型。 我不能在桌子上换。

无论我做什么,我不能改变它在模型的属性。 我尝试过这样转换类型:

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 }

但得到上面的错误。

75880 次浏览

匿名类型中属性的名称必须匹配的类型 还有:

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 }

如果 PAY_SEC_IDnull,或者

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

... 当 PAY_SEC_IDnull时,它默认 p10,同样不会找到匹配(假设 ID 值永远不会是 0)。

在原始的 LINQ 查询中,where 子句包含赋值,而不是比较(即需要“ = =”而不是“ =”)。

我猜测其中一列具有可隐式转换为另一列的类型。很可能是 intint?。这就是 equals隐式转换和 new { X = 1 }new { X = (int?)1 }不兼容的原因。

根据空值是否可能,将冲突列之一转换为 intint?

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

不可否认,在这种特殊情况下,编译器错误非常不清楚,并且没有指出根本原因。

(这个答案是从一个已删除的副本中解救出来的。由于它比目前接受的答案更完整,我将添加它。)

希望这可以帮助那些刚刚有过类似的掌心动作的人,确保对象的属性名是相同的。错误显示如下:

Join 子句中的一个表达式的类型不正确。在调用“ Join”时键入 inreference 失败

这有点误导人,因为当您有两个不同的值类型,即 intdouble时,会出现相同的消息。

在我的例子中,这实际上意味着这两个对象本身是不同的类型,而不是值:

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 }