inner framework ejemplos context c# linq entity-framework join

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.