【问题标题】:LINQ join behaving oddlyLINQ 加入行为异常
【发布时间】:2011-10-16 03:36:15
【问题描述】:

我正在尝试在两个表之间执行连接并将结果限制为 3 个条件。其中2个条件属于主表,第3个条件属于辅助表。这是我正在尝试的查询:

var articles = (from article in this.Context.contents
                join meta in this.Context.content_meta on article.ID equals meta.contentID
                where meta.metaID == 1 && article.content_statusID == 1 && article.date_created > created
                orderby article.date_created ascending
                select article.content_text_key);

意思是通过contentID连接两个表,然后根据metaID(文章类型),statusID过滤,然后得到所有大于datetimecreated的文章。问题是它返回 2 条记录(目前为 4 条)。一个的date_created 小于created,另一个是最初产生created 的记录(因此相等)。

通过删除元数据的连接和 where 子句,结果不会产生任何记录(预期)。我无法理解的是,当我将此联接转换为常规 SQL 时,它工作得很好。显然我误解了join 在这种情况下的功能。什么会导致这种行为?

编辑:
在 LinqPad 中尝试过此操作后,我注意到 LinqPad 提供了预期的结果。我已经在代码中分别尝试了这些查询,直到添加连接后才会开始填充奇怪的结果它似乎发生在记录与限制器在同一天发生的任何日期比较中.

【问题讨论】:

  • 4行数据能不能也贴一下?
  • 如果您还没有,请查看 LinqPad
  • 它也可能有助于查看您的架构。 metaID、content_statusID 和 date_created 的数据类型也可能发挥作用——我(不熟悉您的代码的人)很容易对这些数据类型做出假设。
  • @hunter:在一个完整的 wtf 时刻,我复制/粘贴到了 LinqPad(很棒的工具顺便说一句,谢谢),同样的查询完全符合我的预期。
  • @Dan Esparza: metaID (int), content_statusID(short), date_created (datetime)。

标签: c# linq-to-sql inner-join


【解决方案1】:

我似乎无法添加注释,但在调试模式下,您应该能够在这行代码上放置一个断点。当你这样做时,你应该能够将鼠标悬停在它上面并让它告诉你 LINQ 生成的 sql。请发布该sql。

【讨论】:

  • 另外激活 DataContext 日志记录(例如this.Context.Log = Console.Out
【解决方案2】:

根据您的建议,我将发表我的评论作为答案:

“查看您的架构也可能会有所帮助。metaID 的数据类型, content_statusID 和 date_created 也可能会发挥作用——并且 我(不熟悉您的代码的人)很容易制作 关于这些数据类型的假设。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多