【问题标题】: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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2014-10-01
    • 2020-05-18
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多