Ich erhalte diesen Fehler für die folgende Abfrage
Es kann kein konstanter Wert vom Typ erstellt werden
API.Models.PersonProtocol
. In diesem Zusammenhang werden nur primitive Typen oder Aufzählungstypen unterstützt
ppCombined
unten ist ein IEnumerable
Objekt von PersonProtocolType
, das durch Concat von 2 PersonProtocol
Listen aufgebaut ist.
Warum scheitert das? Können wir die LINQ- JOIN
Klausel nicht innerhalb SELECT
von a verwenden 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
quelle
quelle
Antworten:
Dies kann nicht funktionieren, da
ppCombined
es sich um eine Sammlung von Objekten im Speicher handelt und Sie einen Datensatz in der Datenbank nicht mit einem anderen Datensatz im Speicher verknüpfen können. Sie können stattdessen versuchen, die gefilterten ElementepersonProtocol
derppCombined
Sammlung im Speicher zu extrahieren, nachdem Sie die anderen Eigenschaften aus der Datenbank abgerufen haben:quelle
Ich weiß nicht, ob jemand danach sucht. Ich hatte das gleiche Problem. Eine Auswahl in der Abfrage und dann das Wo (oder Verbinden) und die Verwendung der Auswahlvariablen lösten das Problem für mich. (Problem war in der Sammlung "Reintegraties" für mich)
hoffe das hilft jedem.
quelle
zv.this.Reintegraties.FirstOrDefault().Id
mögliche NullReferenceExceptionIn meinem Fall konnte ich das Problem folgendermaßen beheben:
Ich habe meinen Code geändert:
Dazu:
quelle
p1
undp2
sind beide im Speicher, unabhängig davon, ob sie anonym oder mit einem Variablennamen deklariert sind.Es lohnt sich hinzuzufügen, da das Codebeispiel des OP nicht genügend Kontext bietet, um das Gegenteil zu beweisen, aber ich habe diesen Fehler auch für den folgenden Code erhalten:
Anscheinend kann ich
Int32.Equals
in diesem Zusammenhang kein Int32 mit einem primitiven Int vergleichen. Ich musste (sicher) dazu wechseln:quelle
Fügen Sie einfach AsEnumerable () und ToList () hinzu, damit es so aussieht
quelle