【问题标题】:DbQuery vs IQueryable SQL PerformanceDbQuery 与 IQueryable SQL 性能
【发布时间】:2015-03-12 05:15:30
【问题描述】:

免责声明:我在 SO 上找不到来自 another question 的所有答案。

在 LINQPad 中准备查询时,我观察到一些结果返回为 IQueryable,而在 DbSet 中返回一些结果。

查询的所有版本都可以在这里找到: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 是一个接口,而 DbQuery 显然似乎有更多的方法。但我很想知道如果我要在 C# .NET 4.5.2 和 Entity Framework 6.x 中使用以下查询,哪个可能具有更好的 SQL 性能?

问题:

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

【问题讨论】:

  • 我尝试在 Linqpad 中运行类似的查询,但我得到了 IOrderedQueryable 作为查询的类型。你能具体分享一下你在 linqpad 上写的内容吗?
  • 我在 LINQPad 中引用了我的 EF 模型的 dll。您在 dotnetfiddle.net/r1ghBv 上看到的查询正是我在 4 个单独的 LINQPad 选项卡中看到的,我回答了您的问题 @RaduPascal 吗?

标签: c# entity-framework iqueryable linqpad


【解决方案1】:

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

【讨论】:

  • 我支持你所说的,但让我感到困惑的是(正如我上面所说...)LINQPad 中的第一个 LINQ 查询仅显示 1 个实际 SQL 查询并返回 IQueryable SQL 选项卡,在 LINQPad 中运行第二个 LINQ 查询后,我看到 INFORMATION_SCHEMA.TABLES、[app].[__MigrationHistory](app 是我的架构)、[dbo].[EdmMetadata] 上的几个 (7) SQL 查询开始在 sys.databases 上使用 IF SQL 语句 ...在 LINQPad 的 SQL 选项卡中,它返回 DbQuery 尽管如此,我观察到第二个 LINQ 查询执行得更快一些。我欢迎更精确/时髦的性能分析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2010-11-15
相关资源
最近更新 更多