Oracle11gExpressでODP.NET11.2.0.2.0でEntityFrameworkを使用しています。
フェッチされた行に対して特定の承認を行います。ルールはC#で記述されており.Where
、私の結果の句で使用されています。つまり、(簡略化された例):
var results = Source.Where(selectionPredicate);
var filtered = results.Where(authPredicate);
return filtered.ToList(); <-- exception thrown
それは非常にうまく機能し、すべてのルールがSQLに変換されました。ある時点で、ルールの1つをから変更する必要がありました
(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
(すべてのリレーションにHAVEID
フィールドがあります...)。
表示しようとすると、句ObjectSet.ToTraceString()
のない基本的なフェッチクエリしか表示されないWHERE
ため、フィルタリング述語が含まれているとは思いません。クエリ自体は正しいです。
通常、リレーションからクエリを取得しv$sql
ましたが、間違ったクエリは含まれていません。
Oracleに実際に送信されているクエリを確認するにはどうすればよいですか?たぶん、データベースのプロキシとして機能するツールはありますか?
そのような翻訳が失敗する理由はありますか?