【问题标题】:Why Dbset implement IEnumerable when it already implements IQueryable?Dbset 已经实现了 IQueryable,为什么还要实现 IEnumerable?
【发布时间】:2019-02-18 04:40:24
【问题描述】:
当 Dbset 已经有 IQueryable 时,它似乎实现了 IEnumerable,这不是因为 IQueryable 已经实现了 IEnum 就使得 IEnum 的实现变得多余。
【问题讨论】:
标签:
c#
ienumerable
iqueryable
dbset
【解决方案1】:
首先,我们应该更正您的术语:
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?我认为没有理由强迫开发人员删除冗余信息。
【解决方案2】:
有时您需要特定表的所有行而不需要任何额外的where 子句,格式为IEnumerable。在这种情况下,您可以直接将DbSet 转换为IEnumerable。
【讨论】:
-
抱歉,您的回答不正确。您可以直接将DbSet 转换为IEnuemerable,无论它是显式实现IEnumerable,还是由于层次结构更上层的显式实现而隐式实现IEnumerable。请参阅此 DotNetFiddle 了解我的意思:dotnetfiddle.net/K7Nz78