我在 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.EntityCommandExecutionException
ORA 错误{"ORA-00904: \"Extent1\".\"ID\": invalid identifier"}
。
虽然我们不依赖手写 SQL,但我认为翻译过程存在问题。我想看看实际的查询,例如知道这是哪个表Extent1
(我所有的关系都有ID
字段......)。
当我尝试查看ObjectSet.ToTraceString()
它时,它只显示一个没有WHERE
子句的基本 fetch 查询,所以我不相信它包含过滤谓词。查询本身是正确的。
通常我从v$sql
关系中检索查询,但它不会包含错误的查询。
如何找到实际发送到 Oracle 的查询?也许有工具可以作为数据库的代理?
有什么建议为什么这样的翻译会失败?