我在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
子句的基本提取查询,因此我不认为它包含过滤谓词。查询本身是正确的。
通常我从v$sql
关系中检索查询,但不会包含错误的查询。
如何找到实际发送给Oracle的查询?也许有工具作为数据库的代理?
有关此类翻译失败的任何建议吗?