entity framework中的连接子句中的一个expression式的types不正确
在尝试执行此查询时:
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子句中的一个expression式的types不正确。 在“join”的调用中,types推断失败。
QOT_SEC_ID
是decimal
types, PAY_SEC_ID
是int32
。 我不能在桌上改变它。
无论我做什么,我都无法在模型的属性中改变它。 我试图转换这样的types:
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 }
但得到上面的错误。
匿名types中的属性的types和名称必须匹配:
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 }
在原始的LINQ查询中,where子句包含赋值,而不是比较(即需要“==”而不是“=”)。
我猜测其中一列有一种可以隐式转换为另一种的types。 可能, int
和int?
。 这就是为什么equals
隐含地转换并且new { X = 1 }
与new { X = (int?)1 }
不兼容的原因。
将其中一个冲突列转换为int
或int?
取决于是否有空值。 例如
new { Customer_ID = (int?)pl.Customer_ID, ... }
无可否认,在这种特殊情况下的编译器错误是相当不清楚的,并没有指出根本原因。
(这个答案是从被删除的重复中拯救出来的,因为它比目前接受的更完整,所以我会加上它。)