ホームページ >データベース >mysql チュートリアル >LINQ to Entities が 'System.String ToString()' 例外をスローするのはなぜですか?それを修正するにはどうすればよいですか?
エンティティへの LINQ: "System.String ToString()" エラーのトラブルシューティング
LINQ to Entities (LINQ2E) を使用してリレーショナル データベース内のデータをクエリおよび操作するときに、「LINQ to Entities はメソッド 'System.String ToString()' メソッドとこのメソッドを認識しません」というエラーが発生する場合があります。ストア式に変換できません。」 これは、LINQ 式が、同等の SQL に直接変換できない方法で文字列に対して ToString()
メソッドを使用する場合に発生します。
このシナリオを調べてみましょう:
<code class="language-C#">using (var context = new Context()) { // ... foreach (var item in collection) { IQueryable<entity> pages = from p in context.pages where p.Serial == item.Key.ToString() select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
ここでは、ToString()
句内の item.Key
(文字列) に対して where
が呼び出されます。 ToString()
には直接対応する SQL が存在しないため、LINQ2E はこれを SQL に変換するのに苦労します。
問題の解決策
最も簡単な解決策は、文字列値を変数に事前に割り当てることです。
<code class="language-C#">var strItem = item.Key.ToString(); IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p;</code>
これが機能するのは、LINQ2E が strItem
を定数として認識し、翻訳の必要がなくなるためです。
代替ソリューション (EF Core 2.1 以降):
EF Core 2.1 以降のバージョンでは、SqlFunctions
ヘルパー クラスが提供され、LINQ2E 式専用の StringConvert
メソッドが提供されます。
<code class="language-C#">IQueryable<entity> pages = from p in context.pages where p.Serial == SqlFunctions.StringConvert((double?)item.Key) // Note the cast to (double?) select p;</code>
いずれかの方法を使用すると、「System.String ToString()」例外が解決され、LINQ2E クエリが正しく実行されるようになります。 (double?)
の例の SqlFunctions
キャストで示されているように、潜在的な null 値を適切に処理することを忘れないでください。 これは多くの場合、データベースの互換性のために必要です。
以上がLINQ to Entities が 'System.String ToString()' 例外をスローするのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。