我正在努力使一些代码更具可读性,但我不太了解如何构造扩展方法和/或表达式来实现它。我们目前有许多实体拥有 RecordStatusTypeId
在它们上(从 IRecordStatus
的接口(interface)实现)
public interface IRecordStatus
{
int RecordStatusTypeId { get; set; }
RecordStatusType RecordStatusType { get; set; }
}
这里的目标是替换像 .Where(RecordStatusTypeId != (int)RecordStatusTypes.Deleted)
这样的语句使用类似 .ActiveRecords()
的扩展方法
我可以使用以下扩展方法完成此操作:
public static IQueryable<T> ActiveRecords<T>(this DbSet<T> entitySet)
where T : class, IRecordStatus
{
return entitySet.Where(e => e.RecordStatusTypeId != (int)RecordStatusTypes.Deleted);
}
*我有 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));
我想做的事:
MyDbContext.Entities.Where(e => e.RelatedEntity.ActiveRecords().Any());
如何更改我的扩展方法(或添加表达式)以便我可以在 DbSet
上筛选事件记录以及 linq 子句中的相关实体?
最佳答案
看来您的转换可能有误。 应该:
MyDbContext.Entities.Where(e => e.RelatedEntity.Where(re => re.RecordStatusTypeId != (int)RecordStatusTypes.Deleted));
转换为:
MyDbContext.Entities.Where(e => e.RelatedEntity.ActiveRecords().Any());
关于c# - LINQ to Entities 无法识别该方法(在相关实体上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37440348/