73

尝试执行此查询时:

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是 类型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 }

但得到上面的错误。

4

4 回答 4

173

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

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_IDis null, 或

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

...默认p10when PAY_SEC_IDisnull并且再次找不到匹配项(假设 ID 值永远不会是0)。

于 2013-10-04T14:44:38.700 回答
7

希望这可以帮助我刚刚遇到类似脸的人,确保对象的属性名称相同。错误显示为:

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 }
于 2019-12-18T12:29:52.850 回答
3

我猜其中一列的类型可以隐式转换为另一列。可能,int并且int?。这就是为什么equals隐式转换并且new { X = 1 }new { X = (int?)1 }.

将冲突的列之一转换为intint?取决于是否可能出现空值。例如

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

诚然,这种特殊情况下的编译器错误非常不清楚,也没有指出根本原因。

(这个答案是从一个已删除的副本中拯救出来的。因为它比当前接受的更完整,所以我会添加它。)

于 2016-06-22T20:25:16.823 回答
2

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

于 2015-09-21T22:00:07.253 回答