エンティティへの LINQ: 「メソッドが認識されない」例外への対処
データベースの移行では、メソッド認識の問題が発生することがよくあります。よくあるエラーは次のとおりです:
「LINQ to Entities は 'System.String ToString()' メソッドを認識しないため、このメソッドはストア式に変換できません。」
これは通常、次のように文字列プロパティと文字列式を比較するときに発生します。
<code>IQueryable<entity> pages = from p in context.pages where p.Serial == item.Key.ToString() select p;</code>
根本原因の理解:
ToString()
メソッドは直接実行されず、MethodGroup として扱われます。 LINQ は、このグループを同等の SQL 式に変換しようとします。 ターゲット データベースに直接の ToString()
に相当するものが存在しない場合、変換は失敗します。
解決策: 文字列値を事前に保存します:
最も簡単な修正は、比較の前に文字列の結果を変数に保存することです。
<code>string strItem = item.Key.ToString(); IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p;</code>
これにより、クエリから ToString()
呼び出しが削除され、変換エラーが防止されます。
代替案: SqlFunction の利用:
SqlFunctions
ヘルパー クラスは、LINQ to Entities クエリ用のデータベース固有の関数を提供します。 ToString()
については、次のことを試してください:
<code>IQueryable<entity> pages = from p in context.pages where SqlFunctions.StringConvert((decimal?)p.Serial) == item.Key select p;</code>
(decimal?)
へのキャストに注意してください。これは、p.Serial
の基礎となるデータベースの種類に応じて必要になることがよくあります。 SqlFunctions
はコードを合理化し、一時変数を回避できますが、データ型を慎重に検討する必要があります。
以上がToString() を使用すると、LINQ to Entities が「メソッドが認識されません」例外をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。