联接子句中某个表达式的类型在实体框架中不正确
本文关键字:类型 实体 框架 不正确 表达式 子句 | 更新日期: 2023-09-27 18:33:59
尝试执行此查询时:
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 }
但得到上面的错误。
匿名类型中的类型和属性名称必须匹配:
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 }
。当null
时PAY_SEC_ID
,默认p1
0
,并且再次找不到匹配项(假设永远不会0
ID 值)。
希望这能帮助我刚刚有类似脸掌时刻的人,确保对象的属性名称相同。错误显示为:
联接子句中某个表达式的类型不正确。调用"加入"时类型引用失败
这有点误导,因为当您有两个不同的值类型时,这是相同的消息,即 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 }
我猜其中一列的类型可以隐式转换为另一列。很可能,int
和int?
.这就是为什么equals
隐式转换并且new { X = 1 }
与new { X = (int?)1 }
不兼容的原因。
将冲突列之一强制转换为 int
或 int?
,具体取决于是否可以使用 null。
new { Customer_ID = (int?)pl.Customer_ID, ... }
诚然,这种特殊情况下的编译器错误非常不清楚,并没有指出根本原因。
(此答案是从已删除的副本中解救出来的。由于它比当前接受的更完整,我将添加它。
在原始 LINQ 查询中,where 子句包含赋值,而不是比较(即需要"=="而不是"=")。