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>
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!