Je reçois 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 objet IEnumerable
de PersonProtocolType
, construit à partir de 2 listes PersonProtocol
.
Pourquoi est-ce que cela échoue? Ne pouvons-nous pas utiliser la clause LINQ JOIN
à l'intérieur de 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
})
});
Cela ne peut pas fonctionner car ppCombined
est une collection d'objets en mémoire et vous ne pouvez pas joindre un ensemble de données de la base de données à un autre ensemble de données en mémoire. Vous pouvez plutôt essayer d'extraire les éléments filtrés personProtocol
de la collection ppCombined
en mémoire après vous avez extrait les autres propriétés de la base de données:
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() // database query ends here, the rest is a query in memory
.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()
});
Je ne sais pas si quelqu'un cherche cela… J'ai eu le même problème. Un select sur la requête puis faire le where (ou join) et utiliser la variable select résolvaient le problème pour moi ..__ (le problème était dans la collection "Réintégrations" pour moi)
query.Select(zv => new
{
zv,
rId = zv.this.Reintegraties.FirstOrDefault().Id
})
.Where(x => !db.Taken.Any(t => t.HoortBijEntiteitId == x.rId
&& t.HoortBijEntiteitType == EntiteitType.Reintegratie
&& t.Type == TaakType))
.Select(x => x.zv);
espérons que cela aide quelqu'un.
Dans mon cas, j'ai pu résoudre le problème en procédant comme suit:
J'ai changé mon code à partir de ceci:
var r2 = db.Instances.Where(x => x.Player1 == inputViewModel.InstanceList.FirstOrDefault().Player2 && x.Player2 == inputViewModel.InstanceList.FirstOrDefault().Player1).ToList();
Pour ça:
var p1 = inputViewModel.InstanceList.FirstOrDefault().Player1;
var p2 = inputViewModel.InstanceList.FirstOrDefault().Player2;
var r1 = db.Instances.Where(x => x.Player1 == p1 && x.Player2 == p2).ToList();
Ajoutez simplement AsEnumerable () etToList (), ainsi il ressemble à ceci
db.Favorites
.Where(x => x.userId == userId)
.Join(db.Person, x => x.personId, y => y.personId, (x, y).ToList().AsEnumerable()
ToList().AsEnumerable()
Cela vaut la peine d'être ajouté, car l'exemple de code de l'OP ne fournit pas assez de contexte pour prouver le contraire, mais j'ai aussi reçu cette erreur sur le code suivant:
public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
return GetQueryable()
.FirstOrDefault(x => x.RefersToRetailSaleId.Equals(refersToRetailSaleId));
}
Apparemment, je ne peux pas utiliser Int32.Equals
dans ce contexte pour comparer un Int32 avec une primitive int; Je devais changer (en toute sécurité) en ceci:
public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
return GetQueryable()
.FirstOrDefault(x => x.RefersToRetailSaleId == refersToRetailSaleId);
}