为啥类 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 并未列出每种类型的所有可用扩展方法。 AsQueryableQueryable 类中定义,在DbSet<T> 中,他们选择列出DbSetMigrationsExtensionsQueryableExtensions 中的方法。 【参考方案1】:

我最初的答案虽然希望有用,但并不完全正确,正如 Eli Arbel 指出的那样,所以我重写了它。

DbSet<TEntity> 类具有复杂的继承层次结构。这是一个 UML 图,只显示了它的一部分。

AsQueryable<TEntity>() 方法是在IEnumerable<TEntity> 上定义的扩展方法,它将IEnumerable<TEntity> 转换为IQueryable<TEntity>,并且DbSet<TEntity> 实现IEnumerable<TEntity>,您可以使用扩展方法:

IQueryable<MyEntity> queryable = myDbSet.AsQueryable();

但是,它并不是很有用,因为DbSet&lt;TEntity&gt; 也实现了IQueryable&lt;TEntity&gt;,所以调用AsQueryable() 将简单地返回IQueryable&lt;TEntity&gt; 接口。你不妨把上面的sn-p写成:

IQueryable<MyEntity> queryable = myDbSet;

Queryable.AsQueryable() 的文档中解释了此行为,这是您要查找的文档。

链接的文档页面确实包含许多扩展方法是正确的,但由于原则上可能的扩展方法的范围是无限的,因此不能保证所有扩展方法都会在列表中。特别是 AsQueryable()AsEnumerable() 都不见了。

【讨论】:

谢谢。我现在真的不知道为什么我什至认为 AsQueryable 应该是 IQueryable 的成员。我的问题得到了解答。 (1) 不正确 - 因为IQueryable&lt;T&gt; 继承自IEnumerable&lt;T&gt;,任何实现IQueryable&lt;T&gt; 的类也将显示AsQueryable 扩展方法。

以上是关于为啥类 DBSet 的 AsQueryable() 不在 MSDN 文档中?的主要内容,如果未能解决你的问题,请参考以下文章

类型类的 DbSet 属性返回 null

EF 6不同的DbSet名称来自它所持有的类

EF6 中的这个 Test DBSet 类可以适应 EF Core 吗?

AsQueryable() 的目的是啥?

linq中AsEnumerable和AsQueryable的区别

linq中AsEnumerable和AsQueryable的区别