LINQ to Entities无法识别该方法(在相关实体上)

Wya*_*arp 5 c# linq linq-to-entities entity-framework entity-framework-6

我试图使一些代码更具可读性,并且我不太了解如何构造扩展方法和/或表达式来实现它.我们目前有很多实体都有RecordStatusTypeId它们(从接口实现IRecordStatus)

public interface IRecordStatus
{
    int RecordStatusTypeId { get; set; }
    RecordStatusType RecordStatusType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这里的目标是替换类似于.Where(RecordStatusTypeId != (int)RecordStatusTypes.Deleted)扩展方法的语句.ActiveRecords()

我可以使用以下Extension方法完成此操作:

public static IQueryable<T> ActiveRecords<T>(this DbSet<T> entitySet)
    where T : class, IRecordStatus
{
    return entitySet.Where(e => e.RecordStatusTypeId != (int)RecordStatusTypes.Deleted);
}
Run Code Online (Sandbox Code Playgroud)

*我有这样的扩展方法为DbSet<T>,IQueryable<T>,ICollection<T>,和IEnumerable<T>

这适用于类似的语句MyDbContext.Entities.Where(e => e.RecordStatusTypeId != (int)RecordStatusTypes.Deleted),但如果我尝试替换类似的内容,我会收到错误"LINQ to Entities无法识别方法"

MyDbContext.Entities.Where(e => e.RelatedEntity.Where(re => re.RecordStatusTypeId != (int)RecordStatusTypes.Deleted));
Run Code Online (Sandbox Code Playgroud)

我想做什么:

MyDbContext.Entities.Where(e => e.RelatedEntity.ActiveRecords().Any());
Run Code Online (Sandbox Code Playgroud)

如何更改扩展方法(或添加表达式)以便我可以过滤DbSetlinq子句内部以及相关实体上的活动记录?

小智 2

看来您的转换可能是错误的。应该:

MyDbContext.Entities.Where(e => e.RelatedEntity.Where(re => re.RecordStatusTypeId != (int)RecordStatusTypes.Deleted));
Run Code Online (Sandbox Code Playgroud)

转换成这样:

MyDbContext.Entities.Where(e => e.RelatedEntity.ActiveRecords().Any());
Run Code Online (Sandbox Code Playgroud)