Ho la seguente metodo nella mia classe generica:Cast a tipo IQueryable per interfacciarsi in LINQ to Entities
// This is the class declaration
public abstract class BaseService<TEntity, TKey> : IBaseService<TEntity, TKey> where TEntity : class, IEntity<TKey>
// The Method
public IQueryable<TEntity> GetActive()
{
if (typeof(IActivable).IsAssignableFrom(typeof(TEntity)))
{
return this.repository.Get().Cast<IActivable>()
.Where(q => q.Active)
.Cast<TEntity>();
}
else
{
return this.Get();
}
}
Questa è l'interfaccia:
public interface IActivable
{
bool Active { get; set; }
}
In sostanza, TEntity
è un'entità (POCO) classe, che può implementare IActivable se hanno la proprietà Active
. Voglio il metodo per restituire tutti i record che hanno il valore Active
true. Tuttavia, ho questo errore:
Unable to cast the type 'WebTest.Models.Entities.Product' to type 'Data.IActivable'. LINQ to Entities only supports casting EDM primitive or enumeration types.
Capisco perché si verifica questo errore. Ma gli articoli su SO non hanno alcuna soluzione valida per il mio caso. È realizzabile con Cast
o in altro modo? Nota: non voglio convertire in IEnumerable
, voglio mantenere IQueryable
.
non sapevo che fosse possibile bypassare il casting, bella soluzione! –
Intelligente! Non penserei mai a questo trucco. –
Grandi cose anche se nominare un'interfaccia IActivable mi fa davvero sentire nauseato! Per favore cambiala in IActivatable :) –