实体框架中join子句中的一个表达式的类型不正确

时间:2013-10-04 14:38:25

标签: c# linq entity-framework join linq-to-entities

尝试执行此查询时:

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

QOT_SEC_ID的类型为decimalPAY_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 }

但是上面的错误。

4 个答案:

答案 0 :(得分:116)

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

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 }

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

将其中一个冲突列投放到intint?,具体取决于是否可以使用空值。 E.g。

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

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

(这个答案是从已删除的副本中获得的。由于它比目前接受的更完整,我会添加它。)

答案 3 :(得分:0)

希望这对我刚刚遇到过类似facepalm的人有帮助,请确保该对象的属性名称相同。错误显示为:

  

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 }