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
Lepaskan: 2025-01-17 23:21:11
asal
113 orang telah melayarinya

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

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

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!

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