C# 既然Dbset已经实现了IQueryable,为什么还要实现IEnumerable?
Dbset似乎在已经有IQueryable的情况下实现了IEnumerable,这是否使得IEnum的实现变得多余,因为IQueryable已经实现了IEnum。有时您需要特定表的所有行,而不需要任何附加的C# 既然Dbset已经实现了IQueryable,为什么还要实现IEnumerable?,c#,ienumerable,iqueryable,dbset,C#,Ienumerable,Iqueryable,Dbset,Dbset似乎在已经有IQueryable的情况下实现了IEnumerable,这是否使得IEnum的实现变得多余,因为IQueryable已经实现了IEnum。有时您需要特定表的所有行,而不需要任何附加的where子句,格式为IEnumerable。在这些情况下,您可以直接将DbSet强制转换为IEnumerable首先,我们应该更正您的术语: IQueryable已经实现了IEnum IQueryable没有实现任何功能。它继承了IEnum,这意味着实现IQueryable的每个类都必须实现
where
子句,格式为IEnumerable
。在这些情况下,您可以直接将DbSet
强制转换为IEnumerable
首先,我们应该更正您的术语:
IQueryable已经实现了IEnum
IQueryable
没有实现任何功能。它继承了IEnum
,这意味着实现IQueryable
的每个类都必须实现IEnum
的成员以及IQueryable
的成员
我认为你的问题实际上是这样的:DbSet
为什么被定义为实现IEnum
,当它实现IQueryable
时,它就必须实现IEnum
从技术上讲,声明DbSet
实现IEnum
是多余的
这就留下了一个问题,为什么会有人不必要地声明一个基本接口
我将引用Eric Lippert的这篇博客文章:
也许是因为他们相信这样做会使代码更容易理解,更易于自我记录
或者,也许开发人员编写的代码是
接口I1{}
接口I2{}
接口I3:I1,I2{}
然后意识到,哦,等等,I2应该从I1继承。为什么进行编辑需要开发人员返回并更改I3的声明,使其不包含对I1的明确提及?我认为没有理由强迫开发人员删除冗余信息
Eric Lippert在这篇博文中回答了这个问题:对不起,可能是重复的,但你的答案是错误的。您可以直接将
DbSet
转换为IEnumerable
,无论它是显式实现IEnumerable
,还是隐式实现IEnumerable
,因为显式实现在层次结构的更上层。看看这个DotNetFiddle,了解我的意思: