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
ppCombined
a continuación es un IEnumerable
objeto de PersonProtocolType
, que está construido por concat de 2 PersonProtocol
listas.
¿Por qué está fallando esto? ¿No podemos usar la JOIN
cláusula LINQ dentro SELECT
de 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
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 filtradospersonProtocol
de lappCombined
colecció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().Id
potencial NullReferenceExceptionEn mi caso, pude resolver el problema haciendo lo siguiente:
Cambié mi código de esto:
A esto:
fuente
p1
yp2
está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.Equals
en este contexto para comparar un Int32 con un int primitivo; Tuve que (con seguridad) cambiar a esto:fuente
Equals
perfectamente 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