Rumah >pembangunan bahagian belakang >C++ >Mengapa Pertanyaan LINQ Saya Gagal dengan 'Tidak dapat mencipta nilai jenis tetap…'?

Mengapa Pertanyaan LINQ Saya Gagal dengan 'Tidak dapat mencipta nilai jenis tetap…'?

Linda Hamilton
Linda Hamiltonasal
2025-01-17 23:21:11115semak imbas

Why Does My LINQ Query Fail with

Ralat pertanyaan LINQ: "Tidak boleh mencipta nilai tetap jenis API.Models.PersonProtocol. Hanya jenis primitif atau terbilang disokong dalam konteks ini"

Artikel ini akan menyelesaikan ralat dalam pertanyaan LINQ yang disebabkan oleh cubaan mencipta nilai tetap jenis API.Models.PersonProtocol dalam klausa SELECT. Hanya jenis primitif atau terbilang dibenarkan sebagai pemalar dalam konteks ini.

Masalahnya ialah dengan baris kod berikut:

<code class="language-csharp">personProtocol = (ICollection<personprotocol>) ppCombined
    .Where(a => a.personId == x.personId)
    .Select( b => new PersonProtocol()
     {
         personProtocolId = b.personProtocolId,
         activateDt = b.activateDt,
         personId = b.personId
     })</code>

Di sini, ppCombined ialah koleksi PersonProtocolType objek dalam ingatan. Ia tidak boleh berhubung terus dengan data yang diambil daripada pangkalan data.

Penyelesaian

Untuk menyelesaikan ralat ini, operasi penapisan dan pemetaan ppCombined perlu dialihkan ke luar klausa SELECT. Berikut ialah kod yang diubah suai:

<code class="language-csharp">var persons = db.Favorites
    .Where(f => f.userId == userId)
    .Join(db.Person, f => f.personId, p => p.personId, (f, p) =>
        new // 匿名对象
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // 数据库查询在此结束,其余部分是内存中的查询
    .Select(x =>
        new PersonDTO
        {
            personId = x.personId,
            addressId = x.addressId,   
            favoriteId = x.favoriteId,
            personProtocol = ppCombined
                .Where(p => p.personId == x.personId)
                .Select(p => new PersonProtocol
                {
                    personProtocolId = p.personProtocolId,
                    activateDt = p.activateDt,
                    personId = p.personId
                })
                .ToList()
        });</code>

Dalam pertanyaan yang diubah suai ini, koleksi ppCombined ditapis dan dipetakan terlebih dahulu dalam ingatan untuk mendapatkan objek PersonProtocol yang diperlukan. Hasilnya kemudiannya diberikan kepada harta PersonDTO objek personProtocol. Mengelakkan penggunaan koleksi dalam memori dalam pertanyaan pangkalan data dengan mengalihkan pemprosesan ppCombined selepas AsEnumerable(). AsEnumerable() Tukar hasil pertanyaan pangkalan data kepada koleksi memori, dan semua operasi seterusnya dilakukan dalam ingatan, sekali gus menyelesaikan ralat asal.

Atas ialah kandungan terperinci Mengapa Pertanyaan LINQ Saya Gagal dengan 'Tidak dapat mencipta nilai jenis tetap…'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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