IQueryable和DbQuery有什么区别?

C.L*_*ist 5 .net c# datacontext entity-framework-5

跟进此问题/答案
如何使实体框架数据上下文只读

解决方案是使您的DbContext集合的类型为DbQuery,但这是一个相当特殊的类型(它埋在EF的名称空间中)。

因此,具有DbContext的功能之间有什么区别:

public DbQuery<Customer> Customers
{
    get { return Set<Customer>().AsNoTracking(); }
}
Run Code Online (Sandbox Code Playgroud)

与这个:

public IQueryable<Customer> Customers
{
    get { return Set<Customer>().AsNoTracking(); }
}
Run Code Online (Sandbox Code Playgroud)

...关于DbQuery类,EF文档非常简单,但是我更喜欢让DbContext由接口而不是由类组成的想法,因此我想避免这种情况。DbQuery类还提供哪些其他好处?

更新资料

阅读答案并查看代码后,我意识到我的问题有点傻。我想得太快了!显然,底层的具体对象无论如何都将是DbQuery,因此实际的内部功能将是相同的。在我看来,使用IQueryable是更好的选择。谢谢你的耐心!

Sie*_*jet 3

DBQuery是针对 DbContext 的非通用 LINQ to Entities 查询。公开它将为您提供针对实体的 LINQ 功能。如果不需要,请使用IQueryable接口抽象。

IOrderedQueryable
Run Code Online (Sandbox Code Playgroud)

旨在由查询提供者实施。此接口表示调用 OrderBy、OrderByDescending、ThenBy 或 ThenByDescending 方法的排序查询的结果。当调用 CreateQuery 并传递表示排序查询的表达式树时,生成的 IQueryable 对象必须是实现 IOrderedQueryable 的类型。

IListSource 
Run Code Online (Sandbox Code Playgroud)

为对象提供返回可绑定到数据源的列表的功能。

IDbAsyncEnumerable
Run Code Online (Sandbox Code Playgroud)

IEnumerable 接口的异步版本,允许异步检索元素。此接口用于与实体框架查询交互,不应由自定义类实现。

  • 如果您从另一个项目引用此属性,则使用 DbQuery 将要求另一个项目具有对实体框架的引用,而 IQueryable 无需该引用即可工作。 (2认同)