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