1

我在 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是一些常量参数。Declarations,Declarations.Employment并且Declarations.Employment.Substitutions都是一些外键的导航属性。代码实际上是编译的,所以这些字段在那里等等。我知道这些是大量的连接,但我现在不在乎。所有的属性都是用方法加载的Load

请注意,只有最长的导航属性不起作用,过滤Declarations.Employment.Id没有问题。

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

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

当我尝试查看ObjectSet.ToTraceString()它时,它只显示一个没有WHERE子句的基本 fetch 查询,所以我不相信它包含过滤谓词。查询本身是正确的。

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

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

有什么建议为什么这样的翻译会失败?

4

0 回答 0