我在使用LEFT OUTER JOIN从相当标准的LINQ查询生成的SQL上遇到了一些混淆。该查询是针对免费的Telerik Open Access/Data Access产品的。从Telerik ORM的LINQ查询中生成的SQL
我写了下面的LINQ ...
01.var sessionQ = from sessionHdr in headersQ
02. join sessionBody in bodyQ on
03. sessionHdr.ID equals sessionBody.ID into sessionList
04. from sessionJSON in sessionList.DefaultIfEmpty()
05. where sessionHdr.Format == 13
06.
07. select new WITransmitsVP
08. {
09. ...
10. };
使用这个LINQ语法的OUTER JOIN我期待生成的SQL(ORACLE)看起来像下面这样...
1.SELECT
2. ...
3.
4.FROM "XFEVP"."WI_TRANSMITS_VP" a
5. INNER JOIN "XFEVP"."WI_TRANSMITS_VP_MSG" b ON
6. a."MESSAGE_ID" = b."MESSAGE_ID"
7.WHERE a."MESSAGE_ID" = 60412762;
但是相反,当我登录我看到的输出...
01.SELECT
02. ...
03.
04.FROM "XFEVP"."WI_TRANSMITS_VP" a
05.WHERE a."MESSAGE_ID" = :p0
06.ORDER BY COL1
07.
08.SELECT
09. ...
10.
11.FROM "XFEVP"."WI_TRANSMITS_VP_MSG" a
12.ORDER BY COL1
而不是一个单一的与SELECT OUTER JOIN我看到两个完全独立的SELECT语句。由于每个表包含MILLIONS个记录,并且可能会查询第二个表的所有内容,而不仅仅是连接到第一个SELECT语句的结果的那些内容,所以进行调用的组件最终会由于内存问题而崩溃,因为许多分钟的延迟。
为什么我没有在生成的SQL中获取实际的JOIN语句?有没有解决方法或者我只是做错了什么?
SOLUTION
感谢EVK提供答案。事实证明,问题在于我定义IQueryables的方式。我换了IQuaryables与到的DbContext集合,而不是引用...
01.var sessionQ = from sessionHdr in DBContext.SessionHeaders
02. join sessionBody in DBContext.SessionBodies on
03. sessionHdr.ID equals sessionBody.ID into sessionList
04. from sessionJSON in sessionList.DefaultIfEmpty()
05. where sessionHdr.Format == 13
06.
07. select new WITransmitsVP
08. {
09. ...
10. };
这导致以下生成的SQL ...
SELECT
...
FROM "XFEVP"."WI_TRANSMITS_VP" a
LEFT JOIN "XFEVP"."WI_TRANSMITS_VP_MSG" b ON
(a."MESSAGE_ID" = b."MESSAGE_ID")
WHERE a."FORMAT" = :p0
以及headerQ和bodyQ如何定义? – Evk
headersQ和bodyQ是IQueryable –
如果您将这些查询替换为表定义会发生什么?我的意思只是context.TableName。 – Evk