Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Linq ORA-00904无效标识符。查询在12c中有效,但在11g中无效_Linq_Oracle11g_Oracle12c - Fatal编程技术网

Linq ORA-00904无效标识符。查询在12c中有效,但在11g中无效

Linq ORA-00904无效标识符。查询在12c中有效,但在11g中无效,linq,oracle11g,oracle12c,Linq,Oracle11g,Oracle12c,我有一个LINQ查询,试图在oracle 11g上执行它。 同样的查询在12c上执行得非常好,但在11g上会出现以下错误 ORA-00904: "Extent1"."ID": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause: *Action: 下面是生成的SQL。只显示查询中给出错误的特定部分 SELECT "Extent1".ID, ( SELECT "top".ADMIT_DA

我有一个LINQ查询,试图在oracle 11g上执行它。 同样的查询在12c上执行得非常好,但在11g上会出现以下错误

ORA-00904: "Extent1"."ID": invalid identifier

00904. 00000 -  "%s: invalid identifier"

*Cause:   
*Action:
下面是生成的SQL。只显示查询中给出错误的特定部分

SELECT 
  "Extent1".ID,
  (
    SELECT "top".ADMIT_DATE
    FROM 
          ( 
            SELECT "Project7".ADMIT_DATE
              FROM ( SELECT "Extent7".ADMIT_DATE FROM SYS.Table2 "Extent7" WHERE "Extent1".ID = "Extent7".ID )"Project7"
              ORDER BY "Project7".ADMIT_DATE ASC
          )  "top"
    WHERE ( ROWNUM <= 1) AND ROWNUM <= 1
  ) 
AS C1 FROM SYS.Table1 "Extent1";
有人能解释一下11g中出现问题的原因吗!!此查询在12c上运行良好

更新: 以下是linq查询。 上面的SQL是这些linq查询生成的SQL的一部分

var query = from p in context.Person
            where p.Meetings.Any() &&
            p.Vitals.Any(v => v.WT.HasValue && v.WT >= 20 && v.WT <= 300) &&
            p.Detentions.Any(d => ((d.DX_TYPE != null && d.DX_TYPE == "09") || (d.DX_TYPE == null && "09" == null)) && d.DX.StartsWith("V") && d.DX != null) &&
            p.Meetings.Any(meet => meet.Detentions.Any(d => ((d.DX_TYPE != null && d.DX_TYPE == "09") || (d.DX_TYPE == null && "09" == null)) && d.DX.StartsWith("250") && d.DX != null))
            select new
            {
                p.HISPANIC,
                p.RACE,
                StudentID = p.PersonID,
                AdmissionOn = p.Meetings.OrderBy(meet => meet.ADMIT_DATE).Select(meet => meet.ADMIT_DATE).FirstOrDefault(),
                AdmissionYear = p.Meetings.OrderBy(meet => meet.ADMIT_DATE).Select(meet => meet.ADMIT_DATE).FirstOrDefault().Year,
                AdmissionMonth = p.Meetings.OrderBy(meet => meet.ADMIT_DATE).Select(meet => meet.ADMIT_DATE).FirstOrDefault().Month
            };

var g = query.GroupBy(k => new { Hispanic = k.HISPANIC, Race = k.RACE, AdmissionYear = k.AdmissionYear })
            .Select(k => new { Hispanic = k.Key.Hispanic, Race = k.Key.Race, AdmissionYear = k.Key.AdmissionYear, Persons = k.Count() }).ToList();

问题是Oracle11g不支持在多个查询中引用标识符。Microsoft创建的SQL Server确实支持这一点,这就是为什么您的LINQ工作正常,但Oracle Server不喜欢SQL


从本质上讲,这是oracle提供程序工具中的一个缺陷,它没有将LINQ转换为适用于版本11g的有效SQL。

问题在于oracle 11g不支持引用多个查询深度的标识符。Microsoft创建的SQL Server确实支持这一点,这就是为什么您的LINQ工作正常,但Oracle Server不喜欢SQL


从本质上讲,这是oracle提供程序工具中的一个缺陷,这些工具无法将LINQ转换为11g版的有效SQL。

我很惊讶它在12.1版中可以工作。通常情况下,不能引用超过一层的标识符。因此,Extent1将是SELECT top.admission\u DATE inline SELECT中的有效标识符,而不是嵌套在更深一层的inline视图中的有效标识符。也许12.1已经放宽了这一要求,尽管我不记得读过任何表明这是有意更改的内容。但是,您是真的在寻找这种解释,还是在寻找一个在两个版本中都能工作的查询?您的表真的在sys模式中吗?这是非常不可取的。事实上,这个东西在12c中工作正常!!我不是在寻找具体的解释,我只是在寻找一个有效的解决方案。我想用linq写这个,上面只是一个生成的SQL。我对linq查询的理解有些混乱。也许包含生成该输出的linq查询会有所帮助。@AlexPoole添加了linq查询。我很惊讶它在12.1中能工作。通常情况下,不能引用超过一层的标识符。因此,Extent1将是SELECT top.admission\u DATE inline SELECT中的有效标识符,而不是嵌套在更深一层的inline视图中的有效标识符。也许12.1已经放宽了这一要求,尽管我不记得读过任何表明这是有意更改的内容。但是,您是真的在寻找这种解释,还是在寻找一个在两个版本中都能工作的查询?您的表真的在sys模式中吗?这是非常不可取的。事实上,这个东西在12c中工作正常!!我不是在寻找具体的解释,我只是在寻找一个有效的解决方案。我想用linq写这个,上面只是一个生成的SQL。我对linq查询感到困惑。也许包含生成该输出的linq查询会有帮助。@AlexPoole添加了linq查询。