Maison > développement back-end > C++ > Pourquoi ma requête LINQ échoue-t-elle avec « Impossible de créer une valeur constante de type… » ?

Pourquoi ma requête LINQ échoue-t-elle avec « Impossible de créer une valeur constante de type… » ?

Linda Hamilton
Libérer: 2025-01-17 23:21:11
original
113 Les gens l'ont consulté

Why Does My LINQ Query Fail with

Erreur de requête LINQ : "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"

Cet article résoudra une erreur dans une requête LINQ provoquée par la tentative de création d'une valeur constante de type API.Models.PersonProtocol dans une clause SELECT. Seuls les types primitifs ou énumérés sont autorisés comme constantes dans ce contexte.

Le problème vient de la ligne de code suivante :

<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>
Copier après la connexion

Ici, ppCombined se trouve une collection de PersonProtocolType objets en mémoire. Il ne peut pas se connecter directement aux données extraites de la base de données.

Solution

Pour résoudre cette erreur, les opérations de filtrage et de mappage de ppCombined doivent être déplacées en dehors de la clause SELECT. Voici le code modifié :

<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

Dans cette requête modifiée, la collection ppCombined est d'abord filtrée et mappée en mémoire pour obtenir les objets PersonProtocol requis. Le résultat est ensuite affecté à la propriété PersonDTO de l’objet personProtocol. Éviter l'utilisation de collections en mémoire dans les requêtes de base de données en déplaçant le traitement de ppCombined après AsEnumerable(). AsEnumerable() Convertissez les résultats de la requête de base de données en une collection de mémoire et toutes les opérations ultérieures sont effectuées en mémoire, résolvant ainsi l'erreur d'origine.

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