Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyelesaikan Ralat 'Tidak dapat mencipta nilai malar' dalam Pertanyaan LINQ Menyertai Koleksi Dalam Memori?

Bagaimana untuk Menyelesaikan Ralat 'Tidak dapat mencipta nilai malar' dalam Pertanyaan LINQ Menyertai Koleksi Dalam Memori?

DDD
Lepaskan: 2025-01-17 23:34:09
asal
944 orang telah melayarinya

How to Resolve

Menyelesaikan "Kegagalan Penciptaan Malar" dalam Pertanyaan LINQ Menggunakan Data Dalam Memori

Cabaran:

Pertanyaan LINQ gagal, menghasilkan ralat "Tidak dapat mencipta nilai tetap jenis API.Models.PersonProtocol. Hanya jenis primitif atau jenis penghitungan disokong dalam konteks ini." Ini berlaku semasa operasi gabungan antara rekod pangkalan data dan koleksi dalam memori (bernama ppCombined).

Memahami Ralat:

Ralat ini timbul kerana LINQ kepada Entiti (atau ORM serupa) tidak boleh menterjemah secara langsung gabungan yang melibatkan koleksi dalam memori ke dalam SQL. Kedua-dua set data perlu pemastautin pangkalan data agar gabungan dapat dilaksanakan dengan cekap dalam pangkalan data.

Penyelesaian: Pendekatan Dua Peringkat

Penyelesaian melibatkan pengasingan pertanyaan pangkalan data daripada pemprosesan dalam memori. Mula-mula, dapatkan semula data yang diperlukan daripada pangkalan data, kemudian lakukan gabungan dengan koleksi dalam memori dalam operasi dalam memori yang berasingan:

<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 // anonymous object
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // Crucial: This line switches to in-memory processing
    .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

Kaedah AsEnumerable() adalah kunci. Ia memaksa pelaksanaan pertanyaan pangkalan data, mengembalikan koleksi dalam memori. Pernyataan Select berikutnya kemudian memproses data dalam memori ini, menggabungkannya dengan ppCombined dengan cekap dalam memori aplikasi. Ini mengelakkan pengehadan untuk cuba melakukan gabungan terus dalam konteks pangkalan data.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'Tidak dapat mencipta nilai malar' dalam Pertanyaan LINQ Menyertai Koleksi Dalam Memori?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan