Maison > développement back-end > C++ > Pourquoi ma requête LINQ échoue-t-elle lors de la jointure avec un type non primitif dans la clause SELECT ?

Pourquoi ma requête LINQ échoue-t-elle lors de la jointure avec un type non primitif dans la clause SELECT ?

Mary-Kate Olsen
Libérer: 2025-01-17 23:26:09
original
262 Les gens l'ont consulté

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

Impossible de créer des valeurs constantes pour les types non basiques ou enum

Description du problème

Exception lors de la requête : "Impossible de créer une valeur constante de type API.Models.PersonProtocol. Seuls les types primitifs ou énumérés sont pris en charge dans ce contexte."

Cause fondamentale

La requête a tenté d'utiliser un LINQ JOIN dans la clause SELECT d'un autre JOIN. Toutefois, cette approche échoue car ppCombined (un objet IEnumerable de PersonProtocolType) ne peut pas être utilisé comme type de valeur constante.

Le problème spécifique est que la collection ppCombined représente les données en mémoire, tandis que la requête est exécutée sur les données de la base de données. Les deux ensembles de données ne peuvent pas être combinés.

Solution

Pour résoudre ce problème, extrayez les éléments filtrés de ppCombined en mémoire après avoir utilisé les résultats intermédiaires pour récupérer d'autres propriétés de la base de données.

Requête modifiée

Pour remplacer la requête d'origine, vous pouvez utiliser la méthode modifiée suivante :

La méthode
<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>
Copier après la connexion

garantit que la requête de base de données se termine avant de poursuivre la requête en mémoire. Cela permet à la collection ppCombined d'être filtrée et projetée en mémoire après avoir récupéré les données de la base de données. AsEnumerable()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal