LINQ连接(join)表现异常。

3

我正在尝试在两个表之间执行连接并通过3个条件限制结果。其中2个条件属于主表,第三个条件属于次要表。以下是我尝试的查询:

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进行筛选,最后获取所有大于datetime created的文章。问题在于它只返回了2条记录(目前共4条)。其中一条date_created小于created,另一条与第一条相同(因此相等)。
通过移除关于meta的join和where子句,结果没有记录(符合预期)。我无法理解的是,当我将这个join转换成常规SQL时,它可以正常工作。显然,我误解了在这种情况下join的功能。是什么导致了这种行为?
编辑:在LinqPad中尝试过后,我发现LinqPad提供了预期的结果。我已经分别在代码中尝试了这些查询,但只有在添加join之后才会出现奇怪的结果,似乎是在与限制器相同日期的记录上发生了这种情况。

1
你能否也发布四行数据? - VVS
1
如果你还没有尝试过的话,可以去试试LinqPad。 - hunter
也许看一下您的模式会有所帮助。metaID、content_statusID和date_created的数据类型也可能会产生影响,对于我这样不熟悉您的代码的人来说,很容易对这些数据类型做出假设。 - Dan Esparza
@hunter:在一个完全的wtf时刻,我将代码复制/粘贴到LinqPad中(顺便说一句,这是一个很棒的工具,谢谢),同样的查询结果完全符合我的预期。 - Joel Etherton
@Dan Esparza:metaID(整数),content_statusID(短整数),date_created(日期时间)。 - Joel Etherton
@Dan Esparza:实际上,我进行了完整的双重检查,发现SQL Server中date_created的类型为DateTime(可空)。上下文文件中的类型为Date(不可空)。如果您将您的评论发布为答案,我会接受它。最终解决方案是仔细检查类型。 - Joel Etherton
2个回答

2

我似乎无法添加评论,但在调试模式下,您应该能够在此行代码上设置断点。当您这样做时,您应该能够悬停在其上并让它告诉您LINQ生成的sql语句。请发布该sql语句。


5
可以选择激活 DataContext 日志记录(例如,this.Context.Log = Console.Out)。 - VVS

0
根据您的建议,我将我的评论发布为答案:
“看到您的架构图可能会有所帮助。metaID、content_statusID和date_created这些数据类型也可能起作用——对于不熟悉您的代码的人来说,很容易对这些数据类型做出错误的假设。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接