c# - DbQuery 与 IQueryable SQL 性能对比

标签 c# entity-framework iqueryable linqpad

免责声明:我无法从 another question 中找到所有答案在 SO 上。

在 LINQPad 中准备查询时,我观察到一些结果返回为 IQueryableDbSet 中的一些地方.

查询的所有版本都可以在这里找到:https://dotnetfiddle.net/r1ghBv

// returns IQueryable<Message>
// Time : 133 ms
from m in Messages
    where m.MessageStatusId < 5 && (    
        from mm in Messages
        where mm.MessageStatusId < 5
        group mm by mm.F_Id into g
        select g.Key
    ).Contains(m.F_Id)
    select m

对比

// returns DbQuery<Message>
// Time : 112 ms
from mm in Messages
where mm.MessageStatusId < 5
group mm by mm.F_Id into g
from m in g
select m

在 LINQPad 中,DbQuery 版本有 89 行 IL,而 IQueryable 是 171 行。

DbQuery 是一个类,而 IQueryable 是一个接口(interface),而且 DbQuery 显然似乎有更多的方法。但是我想知道如果我在 C# .NET 4.5.2 和 Entity Framework 6.x 中使用以下查询,哪个可能具有更好的 SQL 性能?

问题:

  1. 上述查询的返回类型是如何决定的?
  2. 在实际查询之前,DbQuery 版本在 LINQPad 的 SQL 选项卡中有 7 个额外的 SQL 查询,而在 IQueryable 版本中,LINQPad 只是直接生成查询,尽管为什么 DbQuery 更快一点?那是因为 EF 库类 DbQuery 吗?

最佳答案

返回类型与消息类型的一行相同。两个查询之间的时间差可以从查询中的第二个“from”来解释。在第一个查询中,您通过 N x N 进行枚举,而在第二个查询中,您通过 N x M 进行枚举。M 是第二个“来自”。在第二个查询中,“g”是所有消息的子集。

关于c# - DbQuery 与 IQueryable SQL 性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27935867/

相关文章:

asp.net-mvc - 是时候开始将 IQueryable<T> 而不是 IList<T> 返回到我的 Web UI/Web API 层了吗?

.net - 无法将表达式类型 'NHibernate.IQueryOver<T,T>' 转换为返回类型 'System.Linq.IQueryable<T>'

c# - 提前访问 ASP.NET MVC 中的异步操作结果

c# - 填写所有要求字段后使用 Bootstrap Modal

c# - EF 与缓慢变化维度的关系

c# - 如何将以下 SQL 转换为 Linq?

c# - 如何在不同文件中拆分 C# 和 HTML 的 Blazor WASM 组件代码?

c# - 我在 RDLC 报告中得到 "The report definition for report ' xxxx.rdlc' has not been specified"

c# - 如何在没有参数的情况下使用 DbContext.Database.SqlQuery(sql, params) 并等待数据结果

c# - 如何在 LINQ 中进行外部连接?