DbQuery与IQueryable SQL性能

时间:2015-01-14 04:25:47

标签: c# entity-framework iqueryable linqpad

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

在LINQPad中准备查询时,我发现某些结果以IQueryable的形式返回,而DbSet中的某些结果则返回https://dotnetfiddle.net/r1ghBv

可以在此处找到查询的所有版本:{{3}}

// 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

VS

// 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是一个类vs IQueryable是一个接口,而DbQuery显然似乎有更多的方法。但是,如果我在C#.NET 4.5.2和Entity Framework 6.x中使用以下查询,我有兴趣知道哪个可能有更好的SQL性能?

问题:

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

1 个答案:

答案 0 :(得分:0)

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