linq Entity Framework中联接子句中的某个表达式的类型不正确

dkqlctbz  于 2022-12-15  发布在  其他
关注(0)|答案(4)|浏览(146)

尝试执行此查询时:

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_ID的类型是decimalPAY_SEC_ID的类型是int32,不允许我在表中更改它。
无论我做什么,我都不能在model的属性中改变它。我试着像这样转换类型:

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 }

但得到上述误差。

thtygnil

thtygnil1#

匿名类型中的类型 * 和 * 属性名称必须匹配:

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_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时,p1默认为0,并且同样找不到匹配项(假设ID值永远不会为0)。

qzlgjiam

qzlgjiam2#

希望这能帮助那些和我有着类似的尴尬时刻的人,确保对象的属性名是相同的。错误显示为:
join子句中某个表达式的类型不正确。Type inreference在调用“Join”时失败
这有点误导,因为当您有两个不同的值类型(即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 }
6qqygrtg

6qqygrtg3#

我猜其中一列的类型可以隐式转换为另一列,可能是intint?,这就是equals隐式转换的原因,并且new { X = 1 }new { X = (int?)1 }不兼容。
根据空值是否可能,将冲突列之一强制转换为intint?

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

诚然,这种特殊情况下的编译器错误相当不清楚,也没有指出根本原因。
(This答案已从已删除的重复项中恢复。由于它比当前接受的答案更完整,我将添加它。)

643ylb08

643ylb084#

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

相关问题