【发布时间】: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 性能?
问题:
- 上述查询中的返回类型是如何确定的?
- 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