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
Linda Hamiltonoriginal
2025-01-17 23:21:11115parcourir

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>

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>

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!

Déclaration:
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