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!