Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于Telerik ORM的LINQ查询生成的SQL_C#_Oracle_Linq_Telerik_Telerik Open Access - Fatal编程技术网

C# 基于Telerik ORM的LINQ查询生成的SQL

C# 基于Telerik ORM的LINQ查询生成的SQL,c#,oracle,linq,telerik,telerik-open-access,C#,Oracle,Linq,Telerik,Telerik Open Access,对于使用左外部联接的相当标准的LINQ查询生成的SQL,我感到有些困惑。该查询针对免费Telerik开放存取/数据存取产品 我写了下面的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 sessio

对于使用左外部联接的相当标准的LINQ查询生成的SQL,我感到有些困惑。该查询针对免费Telerik开放存取/数据存取产品

我写了下面的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语法,我希望生成的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语句,而是两个完全独立的SELECT语句。由于每个表都包含数百万条记录,并且可能正在查询第二个表的所有内容,而不仅仅是与第一个SELECT语句的结果关联的内容,因此进行调用的组件在经过许多分钟的延迟后,最终由于内存问题而崩溃

为什么在生成的SQL中没有得到实际的JOIN语句?是否有解决方法或我只是做错了什么

解决方案

感谢EVK提供了答案。事实证明,问题出在我定义IQueryables的方式上。我用对DBContext集合的引用替换了IQueryables

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

我的猜测是,
headersQ
bodyQ
代表了一些相对复杂的查询(可能不是针对您,而是针对您使用的ORM),因此在构建组合它们的单个查询时会遇到一些困难。因此,它没有抛出一些异常,而是做了一些不好的事情——将两个查询结果拉到内存中,并在内存中组合它们。

还有headersQ和bodyQ是如何定义的?headersQ和bodyQ是iqueryable的如果仅用表定义替换这些查询会发生什么?我的意思是上下文。表名。同样的东西。。。事实上,bodyQ只不过是对DBContext.WiTransmitsVPMessages的引用。。。它从ORM上下文返回一个IQueryable。我收回它!!我只是稍微调整了一下查询,现在看到左连接如我所期望的那样出现。。。我的过滤器没有被应用,但这可能是另一篇文章。我已经在OP中添加了关于解决方案实现的更多细节。谢谢!!