Ich versuche, etwas Code lesbarer zu machen, und verstehe nicht ganz, wie man die Erweiterungsmethode und/oder den Ausdruck dafür strukturiert. Wir haben derzeit viele Unternehmen, die eine RecordStatusTypeId
auf sie haben (von einer Schnittstelle von IRecordStatus
implementiert)LINQ to Entities erkennt die Methode (für eine verbundene Entität) nicht
public interface IRecordStatus
{
int RecordStatusTypeId { get; set; }
RecordStatusType RecordStatusType { get; set; }
}
Das hier Ziel, eine Aussage wie .Where(RecordStatusTypeId != (int)RecordStatusTypes.Deleted)
mit einem Verlängerungsverfahren wie .ActiveRecords()
ersetzen soll ich bin in der Lage dies mit der folgenden Erweiterungsmethode zu erreichen:
public static IQueryable<T> ActiveRecords<T>(this DbSet<T> entitySet)
where T : class, IRecordStatus
{
return entitySet.Where(e => e.RecordStatusTypeId != (int)RecordStatusTypes.Deleted);
}
* ich diese Erweiterung Methode habe für DbSet<T>
, IQueryable<T>
, ICollection<T>
, und IEnumerable<T>
Dies funktioniert gut für Aussagen wie MyDbContext.Entities.Where(e => e.RecordStatusTypeId != (int)RecordStatusTypes.Deleted)
, aber ich habe den Fehler „LINQ to Entities erkennt nicht die Methode“, wenn ich versuche, wie etwas zu ersetzen:
MyDbContext.Entities.Where(e => e.RelatedEntity.Where(re => re.RecordStatusTypeId != (int)RecordStatusTypes.Deleted));
mit dem, was ich d gerne tun:
MyDbContext.Entities.Where(e => e.RelatedEntity.ActiveRecords().Any());
wie kann ich meine Erweiterungsmethoden ändern (oder einen Ausdruck hinzufügen), so dass ich für aktive Aufzeichnungen über die DbSet
sowie auf eine damit verbundene Einrichtung in einer Linq-Klausel filtern können?
Entity Framework Plus kann dies tun: https://github.com/zzzprojects/EntityFramework-Plus –
@CyrilIselin, Danke, ich werde es überprüfen. –
Ihre Methode konnte nicht in T-SQL übersetzt werden, Linq zu Entitäten konnte sie nicht erkennen. Fügen Sie 'AsEnumerable' zu Ihren' Entitäten' hinzu und versuchen Sie es erneut: 'MyDbContext.Entities.AsEnumerable(). Where ...'. –