为啥类 DBSet 的 AsQueryable() 不在 MSDN 文档中?
Posted
技术标签:
【中文标题】为啥类 DBSet 的 AsQueryable() 不在 MSDN 文档中?【英文标题】:Why is AsQueryable() for the class DBSet not in the MSDN documentation?为什么类 DBSet 的 AsQueryable() 不在 MSDN 文档中? 【发布时间】:2016-07-13 14:04:23 【问题描述】:This link 描述了 DBSet 类。这个类型实现了 IQueryable,也就是说,它必须有一个 AsQueryable() 的实现。但是在链接的列表中我找不到这种方法。 谁能告诉我为什么?
【问题讨论】:
可能是因为DbSet
实现了IQueryable
,所以不需要显式强制转换。
它实现了IQueryable
显式。如果您想在该接口上使用所有方法(直接或通过扩展),则必须先将其强制转换为该接口。
MSDN 并未列出每种类型的所有可用扩展方法。 AsQueryable
在Queryable
类中定义,在DbSet<T>
中,他们选择列出DbSetMigrationsExtensions
和QueryableExtensions
中的方法。
【参考方案1】:
我最初的答案虽然希望有用,但并不完全正确,正如 Eli Arbel 指出的那样,所以我重写了它。
DbSet<TEntity>
类具有复杂的继承层次结构。这是一个 UML 图,只显示了它的一部分。
AsQueryable<TEntity>()
方法是在IEnumerable<TEntity>
上定义的扩展方法,它将IEnumerable<TEntity>
转换为IQueryable<TEntity>
,并且DbSet<TEntity>
实现IEnumerable<TEntity>
,您可以使用扩展方法:
IQueryable<MyEntity> queryable = myDbSet.AsQueryable();
但是,它并不是很有用,因为DbSet<TEntity>
也实现了IQueryable<TEntity>
,所以调用AsQueryable()
将简单地返回IQueryable<TEntity>
接口。你不妨把上面的sn-p写成:
IQueryable<MyEntity> queryable = myDbSet;
Queryable.AsQueryable()
的文档中解释了此行为,这是您要查找的文档。
链接的文档页面确实包含许多扩展方法是正确的,但由于原则上可能的扩展方法的范围是无限的,因此不能保证所有扩展方法都会在列表中。特别是 AsQueryable()
和 AsEnumerable()
都不见了。
【讨论】:
谢谢。我现在真的不知道为什么我什至认为 AsQueryable 应该是 IQueryable 的成员。我的问题得到了解答。 (1) 不正确 - 因为IQueryable<T>
继承自IEnumerable<T>
,任何实现IQueryable<T>
的类也将显示AsQueryable
扩展方法。以上是关于为啥类 DBSet 的 AsQueryable() 不在 MSDN 文档中?的主要内容,如果未能解决你的问题,请参考以下文章
EF6 中的这个 Test DBSet 类可以适应 EF Core 吗?