Mam ogólną metodę sprawdzania obiektów typu TEntity w EF. Chcę dodać warunek jako klauzula where, jeśli TEntity implementuje określony interfejs. Metoda mam to:Cast Entity do implementowanego interfejsu w ogólnej metodzie Używanie LINQ dla Entity Framework
public TEntity GetByUserID(Guid userID)
{
var query = this.DbSet;
if (typeof (TEntity).IsImplementationOf<IDeletableEntity>())
{
query = query
.Where((x => !((IDeletableEntity)x).IsDeleted);
}
return query
.FirstOrDefault(x => x.UserID == userID);
}
IsImplementationOf <>() jest metodą, która po prostu zwraca true/false jak sama nazwa wskazuje.
Gdy uruchomię to na adres jednostki realizujące IDeletableEntity, otrzymuję błąd:
Unable to cast the type 'Address' to type 'IDeletableEntity'. LINQ to Entities only supports casting EDM primitive or enumeration types.
Jakieś pomysły jak mogę przejść wokół tego ograniczenia LINQ?
ten prawdopodobnie zadziała, ale najpierw przejdzie do bazy danych i pobierze wszystkie elementy, wyrzuci je do listy, a następnie odfiltruje w pamięci. Rozwiązanie, które znalazłem wysyła warunek do bazy danych, tzn. Otrzymujesz tylko elementy z poprawną wartością flagi. – Vladimir
Ponownie, jak powiedziałem Vladimirowi, jak to możliwe, chyba że możliwe jest wyłapanie IDeletable do T – War