Rumah > pangkalan data > tutorial mysql > Mengapakah LINQ kepada Entiti Melemparkan Pengecualian 'System.String ToString()', dan Bagaimana Saya Boleh Membetulkannya?

Mengapakah LINQ kepada Entiti Melemparkan Pengecualian 'System.String ToString()', dan Bagaimana Saya Boleh Membetulkannya?

Susan Sarandon
Lepaskan: 2025-01-18 15:26:18
asal
324 orang telah melayarinya

Why Does LINQ to Entities Throw a

LINQ kepada Entiti: Menyelesaikan masalah Ralat "System.String ToString()"

Apabila bekerja dengan LINQ kepada Entiti (LINQ2E) untuk menanya dan memanipulasi data dalam pangkalan data hubungan, anda mungkin menghadapi ralat: "LINQ kepada Entiti tidak mengenali kaedah 'System.String ToString()' dan kaedah ini tidak boleh diterjemahkan ke dalam ungkapan kedai." Ini berlaku apabila ungkapan LINQ menggunakan kaedah ToString() pada rentetan dengan cara yang tidak boleh ditukar terus kepada setara SQL.

Mari kita periksa senario ini:

<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>
Salin selepas log masuk

Di sini, ToString() dipanggil pada item.Key (rentetan) dalam klausa where. LINQ2E bergelut untuk menterjemah ini ke dalam SQL kerana ToString() tidak mempunyai rakan SQL langsung.

Penyelesaian Masalah

Penyelesaian yang paling mudah ialah pra-tetapkan nilai rentetan kepada pembolehubah:

<code class="language-C#">var strItem = item.Key.ToString();

IQueryable<entity> pages = from p in context.pages
                           where p.Serial == strItem
                           select p;</code>
Salin selepas log masuk

Ini berfungsi kerana LINQ2E kini melihat strItem sebagai pemalar, menghapuskan keperluan untuk terjemahan.

Penyelesaian Gantian (EF Core 2.1 dan lebih baru):

EF Core 2.1 dan versi yang lebih baru menawarkan kelas pembantu SqlFunctions, menyediakan kaedah StringConvert khusus untuk ungkapan LINQ2E:

<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>
Salin selepas log masuk

Menggunakan salah satu kaedah menyelesaikan pengecualian "System.String ToString()" dan memastikan pertanyaan LINQ2E anda dilaksanakan dengan betul. Ingat untuk mengendalikan potensi nilai nol dengan sewajarnya, seperti yang ditunjukkan oleh (double?) pelakon dalam contoh SqlFunctions. Ini selalunya diperlukan untuk keserasian pangkalan data.

Atas ialah kandungan terperinci Mengapakah LINQ kepada Entiti Melemparkan Pengecualian 'System.String ToString()', dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan