Recibo este error para la consulta a continuación
No se puede crear un valor constante de tipo
API.Models.PersonProtocol. Solo los tipos primitivos o los tipos de enumeración son compatibles en este contexto
ppCombineda continuación es un IEnumerableobjeto de PersonProtocolType, que está construido por concat de 2 PersonProtocollistas.
¿Por qué está fallando esto? ¿No podemos usar la JOINcláusula LINQ dentro SELECTde a 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
usuario2515186
fuente
fuente

Respuestas:
Esto no puede funcionar porque
ppCombinedes 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 filtradospersonProtocolde lappCombinedcolección en la memoria después de haber recuperado las otras propiedades de la base de datos:fuente
No sé si alguien busca esto. Yo tuve el mismo problema. Una selección en la consulta y luego hacer el where (o join) y usar la variable select me resolvió el problema. (El problema estaba en la colección "Reintegraties" para mí)
Espero que esto ayude a cualquiera.
fuente
zv.this.Reintegraties.FirstOrDefault().Idpotencial NullReferenceExceptionEn mi caso, pude resolver el problema haciendo lo siguiente:
Cambié mi código de esto:
A esto:
fuente
p1yp2están ambos en la memoria, ya sea que se declaren anónimamente o por un nombre de variable.Vale la pena agregarlo, ya que el ejemplo de código del OP no proporciona suficiente contexto para demostrar lo contrario, pero también recibí este error en el siguiente código:
Aparentemente, no puedo usar
Int32.Equalsen este contexto para comparar un Int32 con un int primitivo; Tuve que (con seguridad) cambiar a esto:fuente
Equalsperfectamente bien.Simplemente agregue AsEnumerable () y ToList (), para que se vea así
fuente
Tuve este problema y lo que hice y resolví fue que lo usé
AsEnumerable()justo antes de mi cláusula Join. Aquí está mi consulta:Me preguntaba por qué ocurre este problema, y ahora creo que es porque después de realizar una consulta a través de LINQ , el resultado estará en la memoria y no se cargará en los objetos, no sé cuál es ese estado, pero están en algunos estado de transición , creo. Luego, cuando usa
AsEnumerable()oToList(), etc., los está colocando en objetos de memoria física y el problema se está resolviendo.fuente