Rumah > pembangunan bahagian belakang > C++ > Mengapa Pertanyaan LINQ Saya Gagal Apabila Menyertai dengan Jenis Bukan Primitif dalam Klausa SELECT?

Mengapa Pertanyaan LINQ Saya Gagal Apabila Menyertai dengan Jenis Bukan Primitif dalam Klausa SELECT?

Mary-Kate Olsen
Lepaskan: 2025-01-17 23:26:09
asal
262 orang telah melayarinya

Why Does My LINQ Query Fail When Joining with a Non-Primitive Type in the SELECT Clause?

Tidak boleh mencipta nilai malar untuk jenis bukan asas atau enum

Penerangan Masalah

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

Punca Punca

Pertanyaan cuba menggunakan LINQ JOIN dalam klausa SELECT dari JOIN yang lain. Walau bagaimanapun, pendekatan ini gagal kerana ppCombined (objek IEnumerable PersonProtocolType) tidak boleh digunakan sebagai jenis nilai malar.

Masalah khusus ialah koleksi ppCombined mewakili data dalam ingatan, manakala pertanyaan dilaksanakan terhadap data dalam pangkalan data. Dua set data tidak boleh digabungkan.

Penyelesaian

Untuk menyelesaikan isu ini, ekstrak item yang ditapis daripada ppCombined dalam memori selepas menggunakan hasil perantaraan untuk mendapatkan semula sifat lain daripada pangkalan data.

Pertanyaan diubah suai

Untuk menggantikan pertanyaan asal, anda boleh menggunakan kaedah yang diubah suai berikut:

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

memastikan bahawa pertanyaan pangkalan data selesai sebelum meneruskan dengan pertanyaan dalam memori. Ini membolehkan koleksi ppCombined ditapis dan ditayangkan dalam ingatan selepas mendapatkan semula data pangkalan data. AsEnumerable()

Atas ialah kandungan terperinci Mengapa Pertanyaan LINQ Saya Gagal Apabila Menyertai dengan Jenis Bukan Primitif dalam Klausa SELECT?. 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