【问题标题】:Is there some sort of syntax error with this LINQ JOIN?此 LINQ JOIN 是否存在某种语法错误?
【发布时间】:2013-04-08 21:38:14
【问题描述】:

我查看了 SO 和 other sites 上的 various questions,这似乎是在 LINQ 中执行 JOIN 的正确语法,但它只是不起作用: p>

var stages = (from stage in entityManager.TPM_TASKSTAGE select stage);
var results = (from task in pv.TPM_TASK
               join st in stages on st.STAGEID equals task.STAGEID
               where task.TASKTYPE == "Solution"
               select new SolutionTask());

暂时忽略我实际上没有选择任何感兴趣的事实,但我想访问TPM_TASK 每一行的st.NAME 属性。这两个表由STAGEID 链接。我得到编译器错误:

名称“st”不在“equals”左侧的范围内。考虑 交换 'equals' 两边的表达式。

在 LINQ 连接表达式中,sttask 都有红色波浪线。请告诉我我正在做一些愚蠢的事情。

【问题讨论】:

  • 您是否尝试按照错误消息中的确切说明进行操作? ("考虑交换 'equals' 两边的表达式")
  • @JonSkeet - 这实际上是我尝试的第一个,但我的表达是task.STAGEID == st.STAGEID。这会产生类似的编译器错误(建议我交换表达式)。所以我做到了,并切换到equals 认为这可能会有所作为。我没有尝试task.STAGEID equals st.STAGEID 这是有效的组合!叹息。
  • 当您拥有task.STAGEID == st.STAGEID 时,您不会收到相同的错误消息,因为您的加入在那时会完全无效。
  • @JonSkeet - 你是对的,但 Visual Studio 似乎会暂时缓存该错误消息,直到你进行完整编译。 IDE 的错误检查似乎没有即时捕获==,但确实捕获了它无法解析st 的上下文的事实。我的错是没有进行编译以查看 real 错误消息。

标签: c# linq entity-framework join


【解决方案1】:

外部序列中的键选择器应该先行。在您的情况下,外部序​​列是pv.TPM_TASK。所以,你应该加入task.STAGEID equals st.STAGEID

var stages = (from stage in entityManager.TPM_TASKSTAGE select stage);
var results = (from task in pv.TPM_TASK
               join st in stages on task.STAGEID equals st.STAGEID // here
               where task.TASKTYPE == "Solution"
               select new SolutionTask());

【讨论】:

  • 挑剔的编译器。非常感谢!
  • @MikeChristensen:这真的不是挑剔的问题。 equals 的两侧具有完全不同的作用域:左侧不知道st,右侧不知道task。对于这类事情,考虑查询表达式语法的真正含义是很有用的。有关详细信息,请参阅msmvps.com/blogs/jon_skeet/archive/2011/01/28/…
  • @JonSkeet - 感谢您的信息!我是一个 LINQ 新手,当涉及到更复杂的事情(如连接)时,我很容易被甩掉。我认为它们的工作方式类似于 SQL JOIN,其中操作数的顺序无关紧要。
  • @JonSkeet 的链接已损坏。使用这个codeblog.jonskeet.uk/2011/01/28/…
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 2016-12-11
  • 2011-02-22
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多