c# - framework - No se puede crear un valor constante de tipo Solo tipos primitivos o tipos de enumeraciĆ³n son compatibles en este contexto
linq join (3)
Recibo este error para la siguiente consulta
No se puede crear un valor constante de tipo
API.Models.PersonProtocol
. Solo tipos primitivos o tipos de enumeración son compatibles en este contexto
ppCombined
continuación es un objeto IEnumerable
de PersonProtocolType
, que está construido por concat de 2 listas de PersonProtocol
.
¿Por qué esto está fallando? ¿No podemos usar la cláusula LINQ JOIN
dentro de SELECT
de una 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
})
});
En mi caso, pude resolver el problema haciendo lo siguiente:
Cambié mi código de esto:
var r2 = db.Instances.Where(x => x.Player1 == inputViewModel.InstanceList.FirstOrDefault().Player2 && x.Player2 == inputViewModel.InstanceList.FirstOrDefault().Player1).ToList();
A esto:
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();
Esto no puede funcionar porque ppCombined
es una colección de objetos en la memoria y no puede unir un conjunto de datos en la base de datos con otro conjunto de datos que está en la memoria. En su lugar, puede intentar extraer los elementos filtrados personProtocol
de la colección ppCombined
en la memoria después de haber recuperado las otras propiedades de la base de datos:
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()
});
No sé si alguien busca esto. Yo tuve el mismo problema. Un seleccionar en la consulta y luego hacer el where (o join) y usar la variable de selección me resolvió el problema. (El problema estaba en la colección "Reintegraties" para mí)
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);
Espero que esto ayude a cualquiera.