Mam ten kod (to tylko przykładowy kod)
public SomeService ()
{
public Queryable<CarDto> GetDtos()
{
context.Cars.Select(c => new CarDto
{
CarDtoId = c.Id,
Name = c.Name,
Status = GetCarStatus(c)
})
}
private CarStatusEnum GetCarStatus(Car car)
{
if(car.statusId == 2 || car.statusId == 3)
{
return 4;
}
return 5;
}
}
Ten wyjątek rzucania kodu (LINQ do Entities nie rozpoznaje metody GetCarStatus).
Wiem:
- dlaczego to rzuca
- Mogę wykonać ToList (), ale potrzebuję Iqueryble
- Potrafię pisać kod metody bezpośrednio bez użycia metody
Ale chcę wiedzieć, jak to zrobić, aby LINQ to Entities mógł rozpoznać moją metodę?
Odpowiedzi:
0 dla odpowiedzi № 1Nie jestem pewien, czy LINQ to Entities jest w stanie przekonwertować taką funkcję na zapytanie SQL. Może być konieczne użycie Wyrażenie w takich przypadkach.
0 dla odpowiedzi nr 2
Pozwól DTO dokonać konwersji:
class CarDto
{
...
public int StatusId { get; set; }
public CarStatusEnum CarStatus
{
get { return StatusId == 2 || StatusId == 3
? CarStatusEnum.Four
: CarStatusEnum.Five; }
}
}
Więc w zapytaniu wystarczy skopiować TypeId
wartość z Car
. I w aplikacji, do której masz dostęp CarStatus
.
Pamiętaj, że powinieneś wrócić CarStatusEnum
członkowie, a nie zwykłe liczby całkowite (nawet jeśli pasują do siebie CarStatusEnum
wartości. Te może zmiana w przyszłości, która nie złamie twojego kodu, ale na pewno spowoduje ciekawe błędy).