ホームページ > データベース > mysql チュートリアル > LINQ to Entities が 'System.String ToString()' 例外をスローするのはなぜですか?それを修正するにはどうすればよいですか?

LINQ to Entities が 'System.String ToString()' 例外をスローするのはなぜですか?それを修正するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-18 15:26:18
オリジナル
324 人が閲覧しました

Why Does LINQ to Entities Throw a

エンティティへの 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート