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)