实体框架为Oracle DB生成错误的查询。如何查找查询的实际文本?

时间:2012-10-10 13:28:25

标签: c# linq-to-entities oracle11g

我在Oracle 11g Express上使用实体框架和ODP.NET 11.2.0.2.0。

我对获取的行进行了某些授权。规则是用C#编写的,并在我的结果的.Where子句中使用,即(简化示例):

var results = Source.Where(selectionPredicate);
var filtered = results.Where(authPredicate);
return filtered.ToList(); <-- exception thrown

它工作得很好,所有规则都转换为SQL。有一次我不得不改变其中一条规则

(x, y) => x.Declarations.Any(d => d.Employment.Id == y)

(x, y) => x.Declarations.Any(d => d.Employment.Substitutions.Any())

这又是一个简化的例子。 x是我想要获取的对象,y是一个常量参数。 DeclarationsDeclarations.EmploymentDeclarations.Employment.Substitutions都是某些外键的导航属性。代码实际编译,所以这些字段在那里等我知道这些是大规模的连接,但我现在不在乎。所有属性都使用Load方法加载。

请注意,只有最长的导航属性不起作用,对Declarations.Employment.Id进行过滤不会产生任何问题。

问题在于错误本身。它是System.Data.EntityCommandExecutionException,ORA错误为{"ORA-00904: \"Extent1\".\"ID\": invalid identifier"}

虽然我们不依赖手写SQL,但我相信翻译过程存在问题。我想查看实际查询,例如知道哪个表是Extent1(我的所有关系都有ID字段...)。

当我尝试查看ObjectSet.ToTraceString()时,它只显示没有WHERE子句的基本提取查询,因此我不认为它包含过滤谓词。查询本身是正确的。

通常我从v$sql关系中检索查询,但不会包含错误的查询。

如何找到实际发送给Oracle的查询?也许有工具作为数据库的代理?

有关此类翻译失败的任何建议吗?

0 个答案:

没有答案