为什么Dbset已经实现了IQueryable时又实现了IEnumerable?

时间:2019-02-18 04:40:24

标签: c# ienumerable iqueryable dbset

当Dbset已经具有IQueryable时,它似乎实现了IEnumerable,但这并不会使IEnum的实现成为多余,因为IQueryable已经实现了IEnum。

2 个答案:

答案 0 :(得分:1)

首先,我们应该更正您的术语:

  

IQueryable已实现IEnum。

IQueryable并没有实现任何东西。它继承了 IEnum,这意味着每个实现IQueryable的类都必须实现IEnum的成员以及IQueryable的成员。 / p>

我认为您的问题实际上是这样的:为什么将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的明确提及?我认为没有理由强迫开发人员删除多余的信息。

答案 1 :(得分:0)

有时,您需要使用where格式的特定表的所有行,而没有任何附加的IEnumerable子句。在这种情况下,您可以直接将DbSet强制转换为IEnumerable