J'obtiens cette erreur pour la requête ci-dessous
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
ppCombined
ci-dessous est un IEnumerable
objet de PersonProtocolType
, qui est construit par concat de 2 PersonProtocol
listes.
Pourquoi cela échoue-t-il? Ne pouvons-nous pas utiliser la JOIN
clause LINQ à l' intérieur SELECT
d'un JOIN
?
var persons = db.Favorites
.Where(x => x.userId == userId)
.Join(db.Person, x => x.personId, y => y.personId, (x, y) =>
new PersonDTO
{
personId = y.personId,
addressId = y.addressId,
favoriteId = x.favoriteId,
personProtocol = (ICollection<PersonProtocol>) ppCombined
.Where(a => a.personId == x.personId)
.Select( b => new PersonProtocol()
{
personProtocolId = b.personProtocolId,
activateDt = b.activateDt,
personId = b.personId
})
});
c#
linq
entity-framework
join
user2515186
la source
la source
Réponses:
Cela ne peut pas fonctionner car il
ppCombined
s'agit d'une collection d'objets en mémoire et vous ne pouvez pas joindre un ensemble de données dans la base de données avec un autre ensemble de données en mémoire. Vous pouvez essayer à la place d'extraire les éléments filtréspersonProtocol
de lappCombined
collection en mémoire après avoir récupéré les autres propriétés de la base de données:la source
Je ne sais pas si quelqu'un cherche cela. J'ai eu le même problème. Une sélection sur la requête, puis faire le where (ou la jointure) et utiliser la variable select a résolu le problème pour moi. (le problème était dans la collection "Réintégrations" pour moi)
espérons que cela aide n'importe qui.
la source
zv.this.Reintegraties.FirstOrDefault().Id
potentiel NullReferenceExceptionDans mon cas, j'ai pu résoudre le problème en procédant comme suit:
J'ai changé mon code à partir de ceci:
Pour ça:
la source
p1
etp2
sont tous deux en mémoire, qu'ils soient déclarés de manière anonyme ou par un nom de variable.Cela vaut la peine d'ajouter, car l'exemple de code de l'OP ne fournit pas suffisamment de contexte pour prouver le contraire, mais j'ai également reçu cette erreur sur le code suivant:
Apparemment, je ne peux pas utiliser
Int32.Equals
dans ce contexte pour comparer un Int32 avec un int primitif; J'ai dû (en toute sécurité) changer pour ceci:la source
Equals
parfaitement bien.Ajoutez simplement AsEnumerable () etToList (), donc cela ressemble à ceci
la source
J'ai eu ce problème et ce que j'ai fait et résolu le problème, c'est que j'ai utilisé
AsEnumerable()
juste avant ma clause Join. voici ma requête:Je me demandais pourquoi ce problème se produit, et maintenant je pense que c'est parce qu'après avoir effectué une requête via LINQ , le résultat sera en mémoire et non chargé dans des objets, je ne sais pas quel est cet état mais ils sont dans certains état de transition je pense. Ensuite, lorsque vous utilisez
AsEnumerable()
ouToList()
, etc., vous les placez dans des objets de mémoire physique et le problème est résolu.la source