【问题标题】:LinQ: Multiple joins with multiple columns identifiersLinQ:具有多个列标识符的多个连接
【发布时间】:2016-06-08 17:57:32
【问题描述】:

你能帮我理解这个错误信息吗?我肯定做错了什么,但是什么?

连接子句中的其中一个表达式的类型不正确。调用“加入”时类型推断失败。

Res.AddRange(from jh in db.Job
             join jd in db.JobDetail on jh.number equals jd.number
             join js in db.JobSection on new { jd.number, jd.ref, jd.product } equals new { js.number, js.ref, js.Product }
             join oh in db.Order on jd.ref equals oh.ref
             join bh in db.Buyer on jh.id equals bh.id
             where jh.dateModify >= InputDate
             select jh);

错误来自这一行

join js in db.JobSection on new { jd.number, jd.ref, jd.product } equals new { js.number, js.ref, js.Product }

【问题讨论】:

  • 将其更改为 new { jd.number, jd.ref, Product = jd.product } 等于 new { js.number, js.ref, js.Product } - 属性名称应完全匹配匿名类型。
  • 我有同样的错误:join js in db.JobSection on new { a=jd.number, b=jd.ref, c=jd.product } 等于 new { a=js .nu​​mber, b=js.ref, c=js.Product }
  • 然后检查这些列(数字、引用等)的 types 是否完全匹配。假设一个是可空的 int 而另一个只是 int (或短,无论如何) - 它不会工作。所有列类型和名称都应完全匹配
  • @Evk 是的,没错。我的一种类型是左侧的 int 和 int?在右侧。我能做些什么?小技巧之类的?? 0 或 ToString() 不起作用。
  • 只需将一个投射到另一个。如果例如 jd.number 是 int?并且 js.number 是 int,做:new {Number = jd.number ...} 等于 new {Number = (int?) js.number ...}。除了满足编译器之外,这不会产生负面影响。

标签: c# linq


【解决方案1】:

在 Evk(参见 cmets)的帮助下,我找到了解决方案

  1. 我需要命名我的变量
  2. 我需要尊重类型(即使可以为空)

所以正确的解决方案是

Res.AddRange(from jh in db.Job
             join jd in db.JobDetail on jh.number equals jd.number
             join js in db.JobSection on new { a = jd.number, b = (int?)jd.ref, c = jd.product } equals new { a = js.number, b = js.ref, c = js.Product }
             join oh in db.Order on jd.ref equals oh.ref
             join bh in db.Buyer on jh.id equals bh.id
             where jh.dateModify >= InputDate
             select jh);

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多