Estou recebendo este erro para a consulta abaixo
Não foi possível criar um valor constante do tipo
API.Models.PersonProtocol
. Apenas tipos primitivos ou tipos de enumeração são suportados neste contexto
ppCombined
abaixo é um IEnumerable
objeto de PersonProtocolType
, que é construído por concat de 2 PersonProtocol
listas.
Por que isso está falhando? Não podemos usar a 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
user2515186
fonte
fonte
Respostas:
Isso não pode funcionar porque
ppCombined
é uma coleção de objetos na memória e você não pode associar um conjunto de dados no banco de dados a outro conjunto de dados que está na memória. Você pode tentar extrair os itens filtradospersonProtocol
dappCombined
coleção na memória depois de recuperar as outras propriedades do banco de dados:fonte
Não sei se alguém procura por isso. Eu tive o mesmo problema. Uma seleção na consulta e, em seguida, fazer o where (ou join) e usar a variável select resolveu o problema para mim. (o problema estava na coleção "Reintegraties" para mim)
espero que isso ajude alguém.
fonte
zv.this.Reintegraties.FirstOrDefault().Id
potencial NullReferenceExceptionNo meu caso, consegui resolver o problema da seguinte maneira:
Eu mudei meu código a partir disso:
Para isso:
fonte
p1
ep2
estão na memória, sejam eles declarados anonimamente ou por um nome de variável.Vale a pena adicionar, pois o exemplo de código do OP não fornece contexto suficiente para provar o contrário, mas recebi esse erro também no código a seguir:
Aparentemente, não posso usar
Int32.Equals
neste contexto para comparar um Int32 com um int primitivo; Eu tive que (com segurança) mudar para isso:fonte
Equals
perfeitamente bem.Basta adicionar AsEnumerable () eToList (), para que fique assim
fonte
Eu tive esse problema e o que fiz e resolvi foi que usei
AsEnumerable()
antes da minha cláusula Join. aqui está a minha consulta:Fiquei me perguntando por que esse problema acontece, e agora acho que é porque, depois que você faz uma consulta via LINQ , o resultado fica na memória e não é carregado nos objetos, não sei qual é esse estado, mas eles estão em alguns estado de transição, eu acho. Então, quando você usa
AsEnumerable()
ouToList()
etc, os coloca em objetos de memória física e o problema está resolvendo.fonte