gpt4 book ai didi

c# - DbQuery 与 IQueryable SQL 性能对比

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:24 24 4
gpt4 key购买 nike

免责声明:我无法从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com