コード検査: 関数は SQL に変換できないため、データベースコンテキストで呼び出すことはできません
エンティティフレームワークは、LINQ クエリ内のメソッドを DBMS で実行される SQL に変換しようとします。ただし、すべての .NET メソッドがサポートされているわけではありません。LINQ to Entities でサポートされていないメソッドが呼び出される場合、呼び出しは実行時に失敗し、通常は NotSupportedException
がスローされます
この問題を解決するには、SQL に変換可能な LINQ クエリの部分のみがデータベースコンテキストの範囲内で使用されるようにします。他の部分はクエリの後に使用し、メモリ内で実行する必要があります。
以下の例では、翻訳不可能なメソッド Reverse()
が Where()
句内で呼び出され、データベースコンテキストに直接関連付けられています。エンティティフレームワークがこの LINQ クエリを解決しようとするとき、Where()
句とその内部のすべてを SQL に変換する必要がありますが、Reverse()
に相当する SQL がないため失敗します。
この場合の修正方法は、AsEnumerable()
とクエリの実行コンテキストをデータベース IQueryable
からメモリ内の IEnumerable
に移動することです。
関連ページ:
![](https://resources.jetbrains.com/help/img/dotnet/2024.1/inspection_severity_change.png)
コードインスペクション設定を構成する
設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...
![](https://pleiades.io/icons/resharper.png)
コード検査: データベース関数はデータベース以外のコンテキストで呼び出されてはなりません
この問題は、データベース内で (通常は LINQ to Entities クエリの一部として) 実行されるメソッドをそのコンテキスト外で呼び出そうとした場合に報告されます。たとえば、Entity フレームワークは、やなど、LINQ to Entities クエリ内での使用を目的としたメソッドをいくつか提供します。これらのメソッドには意味のある実装はなく、エンティティフレームワークが対応する SQL 関数またはステートメントに変換するためのマーカーとして機能します。LINQ to Entities...