【问题标题】:The type of one of the expressions in the join clause is incorrect in Entity Framework实体框架中连接子句中表达式之一的类型不正确
【发布时间】:2013-10-11 14:48:25
【问题描述】:

在尝试执行此查询时:

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_IDdecimal 类型,PAY_SEC_IDint32 类型。 我不允许在表格中更改它。

无论我做什么,我都无法在模型的属性中更改它。 我曾尝试像这样转换类型:

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 }

但出现上述错误。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 如果我们有一个键可以为空而另一个不能为空,那么我们不能通过一些转换来加入它们吗?
    • 好的,谢谢。我正在为此创建一个问题。
    • 显然,如果您在join 之后有一个where,您还必须将一个参数放入具有此类命名属性的对象中。
    • 谢谢你,我以为我要疯了一会儿
    • 在我的例子中,我有相同的类型,但其中一个变量可以为空:new { A = t.Hrco, B = t.Premp??0 } 我处理了 null 的情况。跨度>
    【解决方案2】:

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

    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 }
    

    【讨论】:

    • 只是补充一点@SimonCurtis,我的加入条件是 new { od.Order_No, od.Line_No } 等于 new { id.order_No., id.Line_No } 我也得到了同样的结果错误。这里的列名区分大小写。请注意,o 在 id.order_No 中是小写字母。将“o”更正为“O”
    • 这绝对解决了我遇到的问题,非常感谢!
    • 你能看到我在这里缺少什么吗? stackoverflow.com/questions/68304878/…我面临着类似的问题。在我的例子中,属性类型和名称是匹配的。仍然出现此错误。
    【解决方案3】:

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

    根据是否可能出现空值,将冲突列之一转换为 intint?。例如

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

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

    (此答案是从已删除的副本中救出的。由于它比当前接受的更完整,我将添加它。)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        相关资源
        最近更新 更多