Maison > développement back-end > C++ > Comment résoudre les erreurs « Impossible de créer une valeur constante » dans les requêtes LINQ rejoignant des collections en mémoire ?

Comment résoudre les erreurs « Impossible de créer une valeur constante » dans les requêtes LINQ rejoignant des collections en mémoire ?

DDD
Libérer: 2025-01-17 23:34:09
original
944 Les gens l'ont consulté

How to Resolve

Résolution de « l'échec de création constante » dans les requêtes LINQ utilisant des données en mémoire

Le défi :

Une requête LINQ a échoué, générant l'erreur "Impossible de créer une valeur constante de type API.Models.PersonProtocol. Seuls les types primitifs ou les types d'énumération sont pris en charge dans ce contexte." Cela s'est produit lors d'une opération de jointure entre des enregistrements de base de données et une collection en mémoire (nommée ppCombined).

Comprendre l'erreur :

Cette erreur se produit car LINQ to Entities (ou ORM similaire) ne peut pas traduire directement les jointures impliquant des collections en mémoire en SQL. Les deux ensembles de données doivent résider dans la base de données pour que la jointure soit exécutée efficacement dans la base de données.

La solution : une approche en deux étapes

La solution consiste à séparer la requête de base de données du traitement en mémoire. Commencez par récupérer les données nécessaires de la base de données, puis effectuez la jointure avec la collection en mémoire dans une opération distincte en mémoire :

<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 // anonymous object
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // Crucial: This line switches to in-memory processing
    .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

La méthode AsEnumerable() est la clé. Il force l'exécution de la requête de base de données, renvoyant une collection en mémoire. L'instruction Select suivante traite ensuite ces données en mémoire, en les joignant efficacement à ppCombined dans la mémoire de l'application. Cela évite les limitations liées à la tentative d'effectuer la jointure directement dans le contexte de la base de données.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal