LINQ to Entities の「ToString() メソッドが認識されません」エラーのトラブルシューティング
LINQ to Entities を使用する場合、「LINQ to Entities はメソッド 'System.String ToString()' メソッドを認識しません。」というエラーが発生する場合があります。これは、LINQ to Entities が ToString()
メソッドをデータベース互換のクエリに変換するのに苦労するために発生します。 解決策には、LINQ クエリ内で ToString()
を直接使用しないようにすることが含まれます。
この問題に対処する修正されたコード例を次に示します。
<code class="language-csharp">using (var context = new Context()) { // ... foreach (var item in collection) { string strItem = item.Key.ToString(); // Assign ToString() result to a variable IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
item.Key.ToString()
の結果を strItem
変数に事前に代入することで、変換の問題を回避します。 where
句では、LINQ to Entities プロバイダーが効果的に処理できる文字列リテラルが使用されるようになりました。
代替アプローチ: SqlFunction の活用
Entity Framework は、データベース固有の関数を提供する SqlFunctions
ヘルパー クラスを提供します。 これは、このような場合により洗練されたソリューションを提供します。 SqlFunctions.StringConvert
メソッドを使用すると、データベース クエリ自体内で変換できます。
このソリューションを実装する方法は次のとおりです:
<code class="language-csharp">using (var context = new Context()) { // ... foreach (var item in collection) { IQueryable<entity> pages = from p in context.pages where SqlFunctions.StringConvert((double?)p.Serial) == item.Key.ToString() //Note the cast to (double?) if needed select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
このアプローチでは、データベース クエリ内で文字列変換が維持されるため、効率が向上し、変換エラーが回避されます。 SqlFunctions.StringConvert
は多くの場合、データベース フィールドを適切な型にキャストする必要があることに注意してください (たとえば、(double?)p.Serial
が数値型の場合は p.Serial
)。 データベース スキーマに一致するように、必要に応じてキャストを調整します。 一般に、パフォーマンスを向上させ、コードをクリーンにするために、この方法が推奨されます。
以上が「LINQ to Entities はメソッド 'System.String ToString()' メソッドを認識しません」という例外を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。