Sto cercando di rendere un po 'più leggibile il codice e non sto affatto imparando come strutturare il metodo di estensione e/o l'espressione per farlo. Al momento abbiamo molte entità che hanno un RecordStatusTypeId
su di loro (implementato da un'interfaccia di IRecordStatus
)LINQ to Entities non riconosce il metodo (su un'entità correlata)
public interface IRecordStatus
{
int RecordStatusTypeId { get; set; }
RecordStatusType RecordStatusType { get; set; }
}
L'obiettivo qui è quello di sostituire una dichiarazione come .Where(RecordStatusTypeId != (int)RecordStatusTypes.Deleted)
con un metodo di estensione come .ActiveRecords()
sono in grado per ottenere questo risultato con il seguente metodo di estensione:
public static IQueryable<T> ActiveRecords<T>(this DbSet<T> entitySet)
where T : class, IRecordStatus
{
return entitySet.Where(e => e.RecordStatusTypeId != (int)RecordStatusTypes.Deleted);
}
* ho questo metodo di estensione per DbSet<T>
, IQueryable<T>
, ICollection<T>
, e IEnumerable<T>
Questa grande opera per dichiarazioni come MyDbContext.Entities.Where(e => e.RecordStatusTypeId != (int)RecordStatusTypes.Deleted)
, ma ottengo l'errore "LINQ to Entities non riconosce il metodo del" se provo a sostituire qualcosa come:
MyDbContext.Entities.Where(e => e.RelatedEntity.Where(re => re.RecordStatusTypeId != (int)RecordStatusTypes.Deleted));
con quello che ho' d piace fare:
MyDbContext.Entities.Where(e => e.RelatedEntity.ActiveRecords().Any());
come posso cambiare i miei metodi di estensione (o aggiungere un Expression) in modo che possa filtrare per i record attivi sul DbSet
e su un'entità correlata all'interno di una clausola di LINQ?
Entity Framework Plus può fare ciò: https://github.com/zzzprojects/EntityFramework-Plus –
@CyrilIselin, grazie, controllerò. –
Non è stato possibile convertire il metodo in T-SQL, ma Linq in entità non è stato in grado di riconoscerlo. Aggiungi 'AsEnumerable' alle tue' Entities' e riprova: 'MyDbContext.Entities.AsEnumerable(). Where ...'. –