Não é possível criar um valor constante do tipo Apenas tipos primitivos ou tipos de enumeração são suportados neste contexto

Estou recebendo este erro para a consulta abaixo

Não é possível criar um valor constante do tipo API.Models.PersonProtocol . Somente tipos primitivos ou tipos de enumeração são suportados neste contexto

ppCombined abaixo é um object IEnumerable de PersonProtocolType , que é construído pela concat de 2 listas de PersonProtocol .

Por que isso está falhando? Não podemos usar a cláusula LINQ JOIN dentro de SELECT de um 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) ppCombined .Where(a => a.personId == x.personId) .Select( b => new PersonProtocol() { personProtocolId = b.personProtocolId, activateDt = b.activateDt, personId = b.personId }) }); 

Isso não funciona porque o ppCombined é uma coleção de objects na memory e você não pode ingressar em um dataset no database com outro dataset que esteja na memory. Você pode tentar extrair os itens filtrados personProtocol da coleção ppCombined na memory depois de recuperar as outras propriedades do database:

 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() }); 

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. (problema estava na coleção “Reintegraties” para mim)

 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 isso ajude alguém.

No meu caso, consegui resolver o problema fazendo o seguinte:

Eu mudei meu código disto:

 var r2 = db.Instances.Where(x => x.Player1 == inputViewModel.InstanceList.FirstOrDefault().Player2 && x.Player2 == inputViewModel.InstanceList.FirstOrDefault().Player1).ToList(); 

Para isso:

 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();