it-swarm.com.de

Konstantenwert des Typs kann nicht erstellt werden. In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt

Ich erhalte diesen Fehler für die folgende Abfrage

Konstanter Wert des Typs API.Models.PersonProtocol kann nicht erstellt werden. In diesem Zusammenhang werden nur Grundtypen oder Aufzählungstypen unterstützt

ppCombined ist ein IEnumerable-Objekt von PersonProtocolType, das aus zwei PersonProtocol-Listen besteht.

Warum scheitert das? Können wir nicht die LINQ JOIN-Klausel innerhalb von SELECT einer JOIN verwenden? 

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

Dies kann nicht funktionieren, da ppCombined eine Sammlung von Objekten im Arbeitsspeicher ist und Sie keine Datengruppe in der Datenbank mit einer anderen Datengruppe im Arbeitsspeicher verknüpfen können. Sie können stattdessen versuchen, die gefilterten Elemente personProtocol der ppCombined-Sammlung in memory after zu extrahieren, nachdem Sie die anderen Eigenschaften aus der Datenbank abgerufen haben:

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

Ich weiß nicht, ob jemand danach sucht ... Ich hatte das gleiche Problem. Ein select in der Query und dann das where (oder join) und die select-Variable verwenden, löste das Problem für mich . (Problem war in der Sammlung "Reintegraties" für mich)

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

hoffe das hilft jedem.

2
Roelant

In meinem Fall konnte ich das Problem folgendermaßen beheben:

Ich habe meinen Code hier geändert:

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

Zu diesem:

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

Fügen Sie einfach AsEnumerable () und ToList () hinzu, damit es so aussieht 

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

Es ist wert, hinzugefügt zu werden, da das Codebeispiel des OP nicht genügend Kontext bietet, um das Gegenteil zu beweisen. Ich habe jedoch auch den folgenden Fehler erhalten: 

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

Anscheinend kann ich Int32.Equals in diesem Zusammenhang nicht verwenden, um ein Int32 mit einem primitiven int zu vergleichen. Ich musste das (sicher) ändern:

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