Otrzymuję ten błąd dla poniższego zapytania
Nie można utworzyć stałej wartości typu
API.Models.PersonProtocol
. W tym kontekście obsługiwane są tylko typy pierwotne lub typy wyliczeniowe
ppCombined
poniżej znajduje się IEnumerable
obiekt programu PersonProtocolType
, który jest konstruowany przez konkatację 2 PersonProtocol
list.
Dlaczego to się nie udaje? Czy nie możemy używać LINQ JOIN
klauzula wewnątrz SELECT
tematyce 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
źródło
źródło
Odpowiedzi:
To nie może działać, ponieważ
ppCombined
jest to zbiór obiektów w pamięci i nie można połączyć zestawu danych w bazie danych z innym zestawem danych znajdującym się w pamięci. Można spróbować zamiast wydobyć przefiltrowane przedmiotypersonProtocol
zppCombined
kolekcji w pamięci po pobraniu inne właściwości z bazy danych:źródło
Nie wiem, czy ktoś tego szuka. Miałem ten sam problem. Wybranie zapytania, a następnie wykonanie gdzie (lub dołączenie) i użycie zmiennej select rozwiązało problem za mnie. (problem był w mojej kolekcji „Reintegraties”)
mam nadzieję, że to pomoże każdemu.
źródło
zv.this.Reintegraties.FirstOrDefault().Id
potencjalny NullReferenceExceptionW moim przypadku udało mi się rozwiązać problem, wykonując następujące czynności:
Zmieniłem mój kod z tego:
Do tego:
źródło
p1
ip2
oba są w pamięci, niezależnie od tego, czy są zadeklarowane anonimowo, czy przez nazwę zmiennej.Warto to dodać, ponieważ przykładowy kod OP nie zapewnia wystarczającego kontekstu, aby udowodnić, że jest inaczej, ale otrzymałem ten błąd również w następującym kodzie:
Najwyraźniej nie mogę użyć
Int32.Equals
w tym kontekście do porównania Int32 z pierwotną liczbą int; Musiałem (bezpiecznie) zmienić na to:źródło
Equals
doskonale.Po prostu dodaj AsEnumerable () iToList (), aby wyglądało to tak
źródło
Miałem ten problem i to, co zrobiłem i rozwiązałem, to ten, którego użyłem
AsEnumerable()
tuż przed klauzulą Join. oto moje zapytanie:Zastanawiałem się, dlaczego ten problem się dzieje, a teraz myślę, że to dlatego, że po wykonaniu zapytania przez LINQ wynik będzie w pamięci i nie zostanie załadowany do obiektów, nie wiem, jaki jest ten stan, ale są w niektórych Chyba stan przejściowy . Następnie, używając
AsEnumerable()
lubToList()
, itp., Umieszczasz je w fizycznych obiektach pamięci i problem jest rozwiązany.źródło