LINQ到实体的投射问题

我试图以通用方式过滤LINQ到实体的查询,但我一直收到错误。 这是一段代码:

private IQueryable FilterDeletedEntities(IQueryable entities) { if (typeof(IDeletable).IsAssignableFrom(typeof(T))) { var deletableEntities = (IQueryable)entities; deletableEntities = deletableEntities.Where(entity => !entity.Deleted); entities = (IQueryable)deletableEntities; } return entities; } 

基本上我正在尝试过滤掉已删除的实体(即’已删除’字段为’true’),当且仅当实体是IDeletable时(即它具有’已删除’字段)。 问题是我无法将IQueryable 转换回IQueryable 。

有想法该怎么解决这个吗? 在你问之前:是的,这种方法必须是通用的。

提前致谢!

但是你可以使用Cast()来转换它。

  entities = deletableEntities.Cast(); 

你也可以将它用于IDeletable,例如,

 private IEnumerable FilterDeletedEntities(IQueryable entities) { if (typeof(IDeletable).IsAssignableFrom(typeof(T))) { return entities.ToList() .Cast() .Where( e => !e.Deleted ) .Cast(); } return entities.ToList(); } 

通过这样做,我能够解决我的问题:

 private IQueryable FilterDeletedEntities(IQueryable entities) { if (typeof(IDeletable).IsAssignableFrom(typeof(T))) { var deletableEntities = (IQueryable)entities; return deletableEntities.Where(entity => !entity.Deleted).Cast(); } return entities; } 

感谢tvanfosson的灵感。

如果你可以假设没有人需要用没有实现IDeletable的T调用这个方法,你可以限制T:

 private IQueryable FilterDeletedEntities(IQueryable entities) where T : IDeletable 

作为奖励,您不需要投射任何东西或使用reflection来测试IDeletable。