c# - IQueryable 和 DbQuery 有什么区别?

标签 c# .net entity-framework-5 datacontext

跟进这个问题/答案
How to make Entity Framework Data Context Readonly

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

那么,拥有 DbContext 与此之间的功能区别是什么:

public DbQuery<Customer> Customers
{
    get { return Set<Customer>().AsNoTracking(); }
}

对比这个:

public IQueryable<Customer> Customers
{
    get { return Set<Customer>().AsNoTracking(); }
}

...EF 文档在涉及 DbQuery 类时非常简洁,但我更喜欢让 DbContext 由接口(interface)而不是类组成的想法,所以我想避免它。 DbQuery 类提供了哪些额外的好处?

更新

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

最佳答案

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

IOrderedQueryable

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

IListSource 

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

IDbAsyncEnumerable

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

关于c# - IQueryable 和 DbQuery 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624426/

相关文章:

c# - 如何将修订详细信息写入文件?

.net - .NET 是否有与 Python 的 issubset 方法等效的方法?

c# - 使用原始 SQL 预加载实体

c# - 我应该在 Entity Framework 中使用继承还是有更好的方法?

c# - 'Extensions.GetBotPerUserInConversationData<TypeT>(Message, string)' 抛出异常

c# - xamarin 组件和引用有什么区别?

C# WPF 应用程序启动非常慢

c# - SpeechSynthesizer 无法获取所有已安装的语音 2

c# - C# 中带标志的 cURL 调用

entity-framework - DbContext.Entry 性能问题