Ho un metodo generico per interrogare oggetti di tipo TEntity in EF. Voglio aggiungere una condizione come clausola where se TEntity implementa un'interfaccia specifica. Il metodo che ho è:Fusioni Entità di interfaccia implementata in un metodo generico utilizzando LINQ per 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 <>() è il metodo che restituisce solo vero/falso, come suggerisce il nome.
Quando ho eseguito questo per l'Indirizzo entità che implementa IDeletableEntity, ottengo un errore:
Unable to cast the type 'Address' to type 'IDeletableEntity'. LINQ to Entities only supports casting EDM primitive or enumeration types.
Tutte le idee come posso andare in giro questa limitazione di LINQ?
Questo probabilmente funzionerà, ma prima andrà nel database e prenderà tutti gli oggetti, li getterà in una lista e poi li filtrerà in memoria. La soluzione che ho trovato invia la condizione al database, cioè ottieni solo gli elementi con il valore di flag corretto. – Vladimir
Anche in questo caso, come ho detto a Vladimir, come può funzionare, a meno che un IDeletable non sia applicabile a un T – War