web-dev-qa-db-fra.com

Impossible de créer une valeur constante de type. Seuls les types primitifs ou les types énumération sont pris en charge dans ce contexte.

Je reçois cette erreur pour la requête ci-dessous

Impossible de créer une valeur constante de type API.Models.PersonProtocol. Seuls les types primitifs ou les types d'énumération sont pris en charge dans ce contexte.

ppCombined ci-dessous est un objet IEnumerable de PersonProtocolType, construit à partir de 2 listes PersonProtocol.

Pourquoi est-ce que cela échoue? Ne pouvons-nous pas utiliser la clause LINQ JOIN à l'intérieur de SELECT d'un 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
                 })
        });
134
user2515186

Cela ne peut pas fonctionner car ppCombined est une collection d'objets en mémoire et vous ne pouvez pas joindre un ensemble de données de la base de données à un autre ensemble de données en mémoire. Vous pouvez plutôt essayer d'extraire les éléments filtrés personProtocol de la collection ppCombined en mémoire après vous avez extrait les autres propriétés de la base de données:

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

Je ne sais pas si quelqu'un cherche cela… J'ai eu le même problème. Un select sur la requête puis faire le where (ou join) et utiliser la variable select résolvaient le problème pour moi ..__ (le problème était dans la collection "Réintégrations" pour moi)

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

espérons que cela aide quelqu'un.

2
Roelant

Dans mon cas, j'ai pu résoudre le problème en procédant comme suit:

J'ai changé mon code à partir de ceci:

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

Pour ça:

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

Ajoutez simplement AsEnumerable () etToList (), ainsi il ressemble à ceci 

db.Favorites
    .Where(x => x.userId == userId)
    .Join(db.Person, x => x.personId, y => y.personId, (x, y).ToList().AsEnumerable()

ToList().AsEnumerable()
0
khaled saleh

Cela vaut la peine d'être ajouté, car l'exemple de code de l'OP ne fournit pas assez de contexte pour prouver le contraire, mais j'ai aussi reçu cette erreur sur le code suivant: 

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
        .FirstOrDefault(x => x.RefersToRetailSaleId.Equals(refersToRetailSaleId));
}

Apparemment, je ne peux pas utiliser Int32.Equals dans ce contexte pour comparer un Int32 avec une primitive int; Je devais changer (en toute sécurité) en ceci:

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
      .FirstOrDefault(x => x.RefersToRetailSaleId == refersToRetailSaleId);
}
0
James Perih