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!