Błąd "Wyrażenie LINQ nie może zostać przetłumaczone"

Błąd "Wyrażenie LINQ nie może zostać przetłumaczone"
Bartosz T
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:4
0

Problem pojawia się przy funkcji .Contains, macie pomysł jak to poprawić?

Kopiuj
Where(x => x.ProffesionTypes.Any(p => profTypes.Contains(p)))
Kopiuj
System.InvalidOperationException: The LINQ expression 'p => __profTypes_0.Contains(p)' could not be translated
edytowany 2x, ostatnio: Riddle
RJ
  • Rejestracja:prawie 3 lata
  • Ostatnio:około 9 godzin
  • Postów:436
0

Nie rozumiem co to query ma robić, co chcesz sprawdzić... I nie możesz wrzucić delegata do Contains z tego co się orientuję.

Podaj logikę to zrobimy query jak trzeba.

Bartosz T
Ma zwracać te rekordy w których przynajmniej jeden element z ProffesionTypes zawiera się w profTypes. to są enumy
markone_dev
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 godziny
  • Postów:823
1

@rjakubowski:
Prawdpodobnie OP chce zrobić coś takiego WHERE costam IN (val1, val2, val3), czyli po LINQ-owemu byłoby coś w stylu var users = db.Where(x => idsToFind.Contains(x.UserId)); ale Contains działa tylko z int i guid z tego co pamiętam.

@Bartosz T:
Jakiego typu jest ProfessionType?


Programujący korpo architekt chmurowy.
Udzielam konsultacji i szkoleń w obszarze szeroko pojętego cloud computingu (Azure, AWS) i architektury systemów IT. Dla firm i prywatnie.
DevOps to proces nie stanowisko.
edytowany 1x, ostatnio: markone_dev
Bartosz T
ProfessionType to enum
markone_dev
To wygląda że odpowiedź jest w moim poście. Zrzutuj do int
Bartosz T
x.ProffesionTypes.Select(x => (int)x).Any(p => profTypes.Contains(p)) - też nie działa
heyyou
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Postów:183
0

jaki orm ?
pamietam ze w .net core ~3 chyba był blad z enumami i trzeba bylo to jakiś castować po chińsku
tj. on to probowal do wartosci typu string przyrownac chyba

edytowany 1x, ostatnio: heyyou
heyyou
pokaz tego enuma, nie masz jakis valueconverterow do tego ?
PawelLukasik
  • Rejestracja:około 16 lat
  • Ostatnio:dzień
  • Postów:82
1
Bartosz T napisał(a):

Problem pojawia się przy funkcji Contains, macie pomysł jak to poprawić?

Where(x => x.ProffesionTypes.Any(p => profTypes.Contains(p)))

System.InvalidOperationException: The LINQ expression 'p => __profTypes_0.Contains(p)' could not be translated

Nie wszystko co napiszesz w C# mapuje się na SQL'a i najwyraźniej to nie i stąd błąd. Przerób zapytanie (jeśli się da - tutaj za mało info dałeś) lub zobacz czy możesz skorzystać z DbFunction.

RJ
  • Rejestracja:prawie 3 lata
  • Ostatnio:około 9 godzin
  • Postów:436
0

Czym jest profTypes? Jeśli profTypes siedzą w pamięci a nie po stronie bazy to jak ma to działać? 😉

Na czym wywolujesz tego Where? Jaki to typ?
Ciągle malo kontekstu.

edytowany 1x, ostatnio: rjakubowski
WeiXiao
Jeśli profTypes siedzą w pamięci a nie po stronie bazy to jak ma to działać? 😉 w zależności od typu np. in :)
MJ
  • Rejestracja:prawie 2 lata
  • Ostatnio:10 miesięcy
  • Postów:58
0

You blow my mind, jeśli ProffesionTypes jest enumem, to jak bez rzutowania chcesz wykonywać na nim operacje Linq? BTW. IDE tego nie podkreśla?
Te operacje wykonujesz na elementach dziedziczących po IEnumerable.
Zcastuj to w taki sposób:
var castedProffesionTypes = Enum.GetValues(typeof(ProffesionTypes)).Cast<ProffesionTypes>();
Co do zapisu,
Where(x => x.ProffesionTypes.Any(p => profTypes.Contains(p)))
Jeśli chcesz wypisać wszystkie rekordy, to nie musisz stosować Select (teoretycznie, ale bez niego w EF siada optymalizacja, więc lepiej dopisać).

Jeśli chcesz uzyskać SQL-owy zapis IN to powinieneś zastosować zapis typu

.Where(u => castedProffesionTypes.Contains(to co zawiera));

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.