【发布时间】:2013-10-16 21:51:33
【问题描述】:
我有一个 Repository 类,作为方法 FromStore<TEntity> 如下:
IQueryable<TEntity> FromStore<TEntity>() where TEntity : class;
使用它,我可以执行以下操作:
MyRepository.FromStore<DatabaseModel>().SingleOrDefault(dm => dm.Id = Id);
现在,我认为当我可以直接提供 SingleOrDefault 方法时让类的用户调用 FromStore 是愚蠢的(您只需要指定泛型类型参数,而不是像通常那样推断它案例)。
所以,我写了一个方法如下:
public TEntity SingleOrDefault<TEntity>(Expression<Func<TEntity, bool>> filter) where TEntity : class
{
return FromStore<TEntity>().SingleOrDefault(filter);
}
太棒了!现在我可以这样做了:
MyRepository.SingleOrDefault<DatabaseModel>(dm => dm.Id = Id);
但是,我想对所有 linq 扩展方法执行相同的操作。
目前我能想到的唯一方法是在我的类上为每个 linq 方法创建类似的包装器方法。
这看起来很傻,肯定有更好的方法吗?
我在想我能否以某种方式让我的 Repository 类继承 linq 扩展方法扩展的类,但它们扩展了 IQueriable<T>。我的班级没有实现这一点,因为存储库中不仅有一个 T。
即使我无法为特定的T 实现IQueryable<T>,我能否以某种方式将 linq 扩展方法应用于我的班级?
【问题讨论】:
-
更复杂的是,存储库实际上实现了
IRepository,这是 API 的用户将看到的。所以我认为扩展方法必须在那里应用(不知何故??)。如果有没有接口的解决方案,但我会感兴趣。 -
我不认为你可以做到这一点,除非有某种方式使用
dynamic。任何解决方案都可能比要求您的客户致电FromStore更麻烦。 -
认为可能是这样。如果我能实现
IQuerable<>(没有指定T)就好了!不过,我会等着看是否有人有其他想法。 -
如果您知道您可能需要的所有
TEntities,您可以为每个具体类显式实现IQueryable<TEntity>。但是,如果不先明确地转换您的存储库,您仍然无法使用Linq扩展方法,这在一定程度上违背了目的。 -
我非常努力地设想一个具有 generic 方法
Something<T>的 non-generic 类,而无需声明该方法本身...我不能:(
标签: c# linq extension-methods