当它已经具有IQueryable时,Dbset似乎实现了IEnumerable,这不会使IEnum的实现冗余,因为IQueryable已经实现了IEnum。
首先,我们应该纠正你的术语:
IQueryable已经实现了IEnum。
IQueryable
没有实施任何东西。它继承了IEnum
,这意味着每个实现IQueryable
的类都必须实现IEnum
的成员以及IQueryable
的成员。
我认为你的问题实际上是这样的:为什么DbSet
定义为实现IEnum
,当它实现IQueryable
所以它必须实现IEnum
无论如何。
从技术上讲,说DbSet
实施IEnum
是多余的。
这留下了一个问题,为什么有人会不必要地说出一个基本接口?
我引用Eric Lippert撰写的这篇博客文章:https://blogs.msdn.microsoft.com/ericlippert/2011/04/04/so-many-interfaces/
也许是因为他们相信这样做会使代码更容易理解,更自我记录。
或者,也许开发人员将代码编写为
接口I1 {}
接口I2 {}
接口I3:I1,I2 {}
并且实现了,哦,等一下,I2应该继承I1。为什么要进行编辑然后要求开发人员返回并更改I3的声明而不包含I1的明确提及?我认为没有理由强迫开发人员删除冗余信息。
有时您需要特定表的所有行,而不需要任何额外的where
子句,采用IEnumerable
格式。在这种情况下,你可以直接将DbSet
施放到IEnumerable
。