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.EntityCommandExecutionExceptionORAエラーが発生します{"ORA-00904: \"Extent1\".\"ID\": invalid identifier"}。
手書きのSQLには依存していませんが、変換プロセスに問題があると思います。実際のクエリを確認したいのですが、たとえば、これがどのテーブルであるかを知りたいですExtent1(すべてのリレーションにHAVEIDフィールドがあります...)。
表示しようとすると、句ObjectSet.ToTraceString()のない基本的なフェッチクエリしか表示されないWHEREため、フィルタリング述語が含まれているとは思いません。クエリ自体は正しいです。
通常、リレーションからクエリを取得しv$sqlましたが、間違ったクエリは含まれていません。
Oracleに実際に送信されているクエリを確認するにはどうすればよいですか?たぶん、データベースのプロキシとして機能するツールはありますか?
そのような翻訳が失敗する理由はありますか?